github.com/rothwerx/packer@v0.9.0/helper/communicator/ssh.go (about)

     1  package communicator
     2  
     3  import (
     4  	"encoding/pem"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  
     9  	"golang.org/x/crypto/ssh"
    10  )
    11  
    12  // SSHFileSigner returns an ssh.Signer for a key file.
    13  func SSHFileSigner(path string) (ssh.Signer, error) {
    14  	f, err := os.Open(path)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	defer f.Close()
    19  
    20  	keyBytes, err := ioutil.ReadAll(f)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	// We parse the private key on our own first so that we can
    26  	// show a nicer error if the private key has a password.
    27  	block, _ := pem.Decode(keyBytes)
    28  	if block == nil {
    29  		return nil, fmt.Errorf(
    30  			"Failed to read key '%s': no key found", path)
    31  	}
    32  	if block.Headers["Proc-Type"] == "4,ENCRYPTED" {
    33  		return nil, fmt.Errorf(
    34  			"Failed to read key '%s': password protected keys are\n"+
    35  				"not supported. Please decrypt the key prior to use.", path)
    36  	}
    37  
    38  	signer, err := ssh.ParsePrivateKey(keyBytes)
    39  	if err != nil {
    40  		return nil, fmt.Errorf("Error setting up SSH config: %s", err)
    41  	}
    42  
    43  	return signer, nil
    44  }