Added some basic functionality for creating and loading private and public keys.
This commit is contained in:
parent
0919fef40d
commit
a842df2410
61
keys.go
Normal file
61
keys.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package easyssh
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/x509"
|
||||||
|
"encoding/pem"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/ssh"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CreateKeyPairFiles is the equivalent of running 'ssh-keygen -t rsa"'
|
||||||
|
func CreateKeyPairFiles(publicKeyPath, privateKeyPath string) error {
|
||||||
|
|
||||||
|
privateKeyFile, err := os.Create(privateKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer privateKeyFile.Close()
|
||||||
|
|
||||||
|
publicKeyFile, err := os.Create(publicKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer publicKeyFile.Close()
|
||||||
|
|
||||||
|
return CreateKeyPair(publicKeyFile, privateKeyFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateKeyPair creates a new SSH Key Pair writing the formatted keys to the corresponding io.Writers
|
||||||
|
func CreateKeyPair(publicKey, privateKey io.Writer) (err error) {
|
||||||
|
k, err := rsa.GenerateKey(rand.Reader, 1024)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
privatePEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)}
|
||||||
|
err = pem.Encode(privateKey, privatePEM)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
public, err := ssh.NewPublicKey(&k.PublicKey)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = publicKey.Write(ssh.MarshalAuthorizedKey(public))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadPrivateKey loads a file at the provided path and attempts to load it into an ssh.Signer that can be used for SSH servers
|
||||||
|
func LoadPrivateKey(filePath string) (ssh.Signer, error) {
|
||||||
|
|
||||||
|
privateBytes, err := ioutil.ReadFile(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ssh.ParsePrivateKey(privateBytes)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user