Created
March 17, 2020 17:43
-
-
Save jonfriesen/d4cbe659a0542ef6ca1c7a4c246831c2 to your computer and use it in GitHub Desktop.
Generate SSH key pair in Go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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