Skip to content

Instantly share code, notes, and snippets.

@jonfriesen
Created March 17, 2020 17:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonfriesen/d4cbe659a0542ef6ca1c7a4c246831c2 to your computer and use it in GitHub Desktop.
Save jonfriesen/d4cbe659a0542ef6ca1c7a4c246831c2 to your computer and use it in GitHub Desktop.
Generate SSH key pair in Go
// Note: There were a couple blogposts I used to write this but for the life of me can't seem to find them. Will update with references if I do.
// generateSSHKeyPair creates a private & public key pair
func generateSSHKeyPair(bitSize int) (privateKey []byte, publicKey []byte, err error) {
// generate private key
pKey, err := generatePrivateKey(keySize)
if err != nil {
return nil, nil, errors.Wrap(err, "failed to create private key")
}
// generate public key
pubKey, err := generatePublicKey(&pKey.PublicKey)
if err != nil {
return nil, nil, errors.Wrap(err, "failed to create public key")
}
return convertToPem(pKey), pubKey, nil
}
// generatePrivateKey generates and returns a rsa private key
func generatePrivateKey(keySize int) (*rsa.PrivateKey, error) {
pKey, err := rsa.GenerateKey(rand.Reader, keySize)
if err != nil {
return nil, err
}
if err := pKey.Validate(); err != nil {
return nil, err
}
return pKey, nil
}
// generatePublicKey generates and returns a public ssh key (from private key) as []byte
func generatePublicKey(pKey *rsa.PublicKey) ([]byte, error) {
pubKey, err := ssh.NewPublicKey(pKey)
if err != nil {
return nil, err
}
return ssh.MarshalAuthorizedKey(pubKey), nil
}
// convertToPem converts an rsa.PrivateKey to a []byte pem format key
func convertToPem(pKey *rsa.PrivateKey) []byte {
pDer := x509.MarshalPKCS1PrivateKey(pKey)
return pem.EncodeToMemory(&pem.Block{
Headers: nil,
Type: "RSA PRIVATE KEY",
Bytes: pDer,
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment