2014-01-16 84 views
8

我正尝试在Go中生成用于SSH的密钥对。我似乎正在创建一个私钥,但我无法弄清楚如何以正确的格式生成一个公钥。转到 - 生成SSH公钥

下面的代码:

privateKey, err := rsa.GenerateKey(rand.Reader, 2014) 
if err != nil { 
    return nil, err 
} 

privateKeyDer := x509.MarshalPKCS1PrivateKey(privateKey) 
privateKeyBlock := pem.Block{ 
    Type: "RSA PRIVATE KEY", 
    Headers: nil, 
    Bytes: privateKeyDer, 
} 
privateKeyPem := string(pem.EncodeToMemory(&privateKeyBlock)) 

publicKey := privateKey.PublicKey 
publicKeyDer, err := x509.MarshalPKIXPublicKey(&publicKey) 
if err != nil { 
    return nil, err 
} 

publicKeyBlock := pem.Block{ 
    Type: "PUBLIC KEY", 
    Headers: nil, 
    Bytes: publicKeyDer, 
} 
publicKeyPem := string(pem.EncodeToMemory(&publicKeyBlock)) 

    fmt.Println(privateKeyPem) 
    fmt.Println(publicKeyPem) 

我得到这样的输出:

-----BEGIN RSA PRIVATE KEY----- 
MIIEhgIBAAKB/DFnL5O2LCGJQJ/6W299AsrXsHU3nsGVTbjoDqXjdHboSqAuv0ap 
oyTPQuBVNff1X0AdVDwjat2vSAukST/3PmRX4TNU4jV0rog/z6grexOCSl3oatJO 
i80t+F6uuTD6XTh5C5yDQNI/sTyaPpydbI+P87UuY4UapZaei7fwc3MfurJ+jwEJ 
c+jOWbll2YhIgCOuIe0GRX4e4CDC2KiO/BqAWCPQNjk0Y0iC2+J+2Qy3QBOJTVO8 
E2DzIhIe4VjKK6OVVesYmJWSXX/Jx382CvUDv5ss8mxGEs3yge4zeQ0GPPDaqTFw 
OJ1uppsdj10ZiW92E8v/fYwlBNGfrQIDAQABAoH8C2OCMEcavVBquXZ5haYH8sLu 
RtdfnbjRhgLY/Z0FyDOcoHimV5/boCy3egeqvVKvdpRMSuDPTfOOZECnMjvJAlDP 
9Yln7HLNmVM8h8QeR00N38Aof/rjd5VVYF5fCs9slgwxhQ8s7ksIjLPyIyCXWjER 
OX9MKe8OpT4/b1Pa1X6I28PaC3LVjDHEkigPd705i8VuF2nvZ3+Kb5uQHeczsq6f 
LfJTME0uewB2UhKokJRUlqNpRMp+N4DUhChwC9yN0EXlxzbTUsW8ouLFNKLCqlxZ 
YAJqWfCFFe14f++Ie4tfyFI0e1VP7Gge+5vxiIkuPapj5MMg47bVQHtxAn5olgFT 
/RWHAGsGPS8cyFZ3sh01qmfaPl4mgthTQdSKj/YKUXy8/u9Wqdk7DK5wfTxD6/Go 
HUpNtXkEhL5HmWxq85lhXzos98C/hNlo2GIP1X3D7IgGTwe3z2nlKUCAXLdc3Wwf 
GmpBsg3HXZ7ZBL2WwH6JNn/KgbjSioZChvMCfnjtHZMoYfgoD3ncUey4Db5K2/cu 
mWPGosswouUOnEFjYHKxo2glxxPgtOK2EgURxE/t/Tz+WPak4gl8fMjg4v8cjuxo 
kZdH6Izm0wqMrPOdKFFwFFSdwhl5DG9Ikg/UTznAprvkfmtF32/sX1Ux4NBD6paq 
XvMSLPz67VIm3wJ+JAvvkT8deFZQjOnxnv39r2uYXbLJ8JKmaKeYX7nEw60ypAPJ 
9mn3m+sWkB+iz+qaJt7ff4342ie9+iy2WH8suwAS0Vi8+Fq7+EaVmGlcAxEWM70G 
dQYwJs46NV2ueY97M2qtpVq5XMM9tIU0BqB3p8nY0voRuX5UcVyFQdC5An493VDc 
EDTOt+/y7/wZlq+xQqr18ikXGm/+c4tik+7spOKayrZGec03JiZkNbFSVpyQJ7j+ 
k0EALapWIBHW0vZOfVXBLF4PfwJB03T0WLPCjgwqXaSJBYxfa8YoyH+xCXTenuiu 
B1+FkeGVaN/8vd+9rIE/QzoAMLRDWDxBYxECfkAVgjWSiLoK3fJcdwsh6e9bxgK7 
EI8yFnWyFhymHTLjACcw9DIZyiaFkpjkXjB7NX0EzWtM5FPUmfrFFLlCpHAzZ8P6 
FjXyOcfVlE9IF4gZHNUXHj8R0HflPWg9K9pfAxBhmc5+GJ6aL4smjvpp05fwPD6u 
0yYyxcpe8iznsQ== 
-----END RSA PRIVATE KEY----- 
-----BEGIN PUBLIC KEY----- 
MIIBHDANBgkqhkiG9w0BAQEFAAOCAQkAMIIBBAKB/DFnL5O2LCGJQJ/6W299AsrX 
sHU3nsGVTbjoDqXjdHboSqAuv0apoyTPQuBVNff1X0AdVDwjat2vSAukST/3PmRX 
4TNU4jV0rog/z6grexOCSl3oatJOi80t+F6uuTD6XTh5C5yDQNI/sTyaPpydbI+P 
87UuY4UapZaei7fwc3MfurJ+jwEJc+jOWbll2YhIgCOuIe0GRX4e4CDC2KiO/BqA 
WCPQNjk0Y0iC2+J+2Qy3QBOJTVO8E2DzIhIe4VjKK6OVVesYmJWSXX/Jx382CvUD 
v5ss8mxGEs3yge4zeQ0GPPDaqTFwOJ1uppsdj10ZiW92E8v/fYwlBNGfrQIDAQAB 
-----END PUBLIC KEY----- 
+2

“正确格式化”,是否指OpenSSH使用的单行格式?因为你已经显示的也是一些其他工具正确格式化的公钥块。 –

+0

如果你想尝试,我想我遇到了我下面添加的全部解决方案。 – JimB

回答

8

可以使用OpenSSH的ssh-keygen转换文件。

写PEM到一个文件(如pubkey.pem),并将其转换像这样:

ssh-keygen -m PKCS8 -f pubkey.pem -i 

或者你可以从ssh包中使用该功能MarshalAuthorizedKey

// using publicKey from above. 
// though NewPublicKey takes an interface{}, it must be a pointer to a key. 
pub, err := ssh.NewPublicKey(&publicKey) 
if err != nil { 
    // do something 
} 
pubBytes := ssh.MarshalAuthorizedKey(pub) 
fmt.Println(string(pubBytes)) 
6

如果您正在寻找以OpenSSH authorized_key文件包含的格式生成密钥,下面是我最近编写的帮助程序:

// MakeSSHKeyPair make a pair of public and private keys for SSH access. 
// Public key is encoded in the format for inclusion in an OpenSSH authorized_keys file. 
// Private Key generated is PEM encoded 
func MakeSSHKeyPair(pubKeyPath, privateKeyPath string) error { 
    privateKey, err := rsa.GenerateKey(rand.Reader, 1024) 
    if err != nil { 
     return err 
    } 

    // generate and write private key as PEM 
    privateKeyFile, err := os.Create(privateKeyPath) 
    defer privateKeyFile.Close() 
    if err != nil { 
     return err 
    } 
    privateKeyPEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)} 
    if err := pem.Encode(privateKeyFile, privateKeyPEM); err != nil { 
     return err 
    } 

    // generate and write public key 
    pub, err := ssh.NewPublicKey(&privateKey.PublicKey) 
    if err != nil { 
     return err 
    } 
    return ioutil.WriteFile(pubKeyPath, ssh.MarshalAuthorizedKey(pub), 0655) 
} 
+0

你需要运行什么导入? –

+0

这是我用过,还没有测试,但构建OK: ''' “加密/ RSA” “加密/兰特” “编码/ PEM” “加密/ X509” “golang.org/x/加密/ ssh“ ”io/ioutil“ ''' –

+0

它真的有效 –