如何在 golang ssh 中使用加密私钥
How to use an encrypted private key with golang ssh
我将不胜感激,因为我不知道如何解密加密密钥以便将其与 golang ssh 一起使用。我正在尝试将其他两个代码源(包括 this 一个)混合在一起,但无法使其正常工作。
我想我正在使用 DER,但需要将其编组回 PEM 以便与 crypto/ssh
一起使用
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326
...
-----END RSA PRIVATE KEY-----
我读了:
key, err := ioutil.ReadFile(privateKey)
if err != nil {
log.Fatalf("Unable to read private key: %v", err)
}
使用未加密的 (!) 密钥,我可以:
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
log.Fatalf("Unable to parse private key: %v", err)
}
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
}
这行得通。
我重复使用了一些我认为可以将解密的 PEM 作为 DER 的代码:
func decrypt(key []byte, password []byte) []byte {
block, rest := pem.Decode(key)
if len(rest) > 0 {
log.Fatalf("Extra data included in key")
}
der, err := x509.DecryptPEMBlock(block, password)
if err != nil {
log.Fatalf("Decrypt failed: %v", err)
}
return der
}
但是,我如何从 DER 到签名者?
或者,解决这个问题的最佳方法是什么?
如果您的 DER 块带有 RSA 私钥,则使用 x509.ParsePKCS1PrivateKey
解析密钥,并使用 ssh.NewSignerFromKey
获取 ssh.Signer
key, err := x509.ParsePKCS1PrivateKey(der)
if err != nil {
log.Fatal(err)
}
signer := ssh.NewSignerFromKey(key)
我将在这里提供一个替代方案,它允许重用 ssh.ParsePrivateKey(key)
。我修改了decrypt
函数对私钥进行解密和编码,如果是加密的,return,这样就可以直接使用returned key
在 ssh.ParsePrivateKey(key)
。它利用 pem.EncodeToMemory
从解密的 PEM 块中获取密钥。
func decrypt(key []byte, password []byte) []byte {
block, rest := pem.Decode(key)
if len(rest) > 0 {
log.Fatalf("Extra data included in key")
}
if x509.IsEncryptedPEMBlock(block) {
der, err := x509.DecryptPEMBlock(block, password)
if err != nil {
log.Fatalf("Decrypt failed: %v", err)
}
return pem.EncodeToMemory(&pem.Block{Type: block.Type, Bytes: der})
}
return key
}
import "golang.org/x/crypto/ssh"
使用未加密的密钥:
signer, err := ssh.ParsePrivateKey(key)
使用加密密钥:
signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte("password"))
然后:
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
}
我将不胜感激,因为我不知道如何解密加密密钥以便将其与 golang ssh 一起使用。我正在尝试将其他两个代码源(包括 this 一个)混合在一起,但无法使其正常工作。
我想我正在使用 DER,但需要将其编组回 PEM 以便与 crypto/ssh
一起使用-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326
...
-----END RSA PRIVATE KEY-----
我读了:
key, err := ioutil.ReadFile(privateKey)
if err != nil {
log.Fatalf("Unable to read private key: %v", err)
}
使用未加密的 (!) 密钥,我可以:
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
log.Fatalf("Unable to parse private key: %v", err)
}
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
}
这行得通。
我重复使用了一些我认为可以将解密的 PEM 作为 DER 的代码:
func decrypt(key []byte, password []byte) []byte {
block, rest := pem.Decode(key)
if len(rest) > 0 {
log.Fatalf("Extra data included in key")
}
der, err := x509.DecryptPEMBlock(block, password)
if err != nil {
log.Fatalf("Decrypt failed: %v", err)
}
return der
}
但是,我如何从 DER 到签名者?
或者,解决这个问题的最佳方法是什么?
如果您的 DER 块带有 RSA 私钥,则使用 x509.ParsePKCS1PrivateKey
解析密钥,并使用 ssh.NewSignerFromKey
获取 ssh.Signer
key, err := x509.ParsePKCS1PrivateKey(der)
if err != nil {
log.Fatal(err)
}
signer := ssh.NewSignerFromKey(key)
我将在这里提供一个替代方案,它允许重用 ssh.ParsePrivateKey(key)
。我修改了decrypt
函数对私钥进行解密和编码,如果是加密的,return,这样就可以直接使用returned key
在 ssh.ParsePrivateKey(key)
。它利用 pem.EncodeToMemory
从解密的 PEM 块中获取密钥。
func decrypt(key []byte, password []byte) []byte {
block, rest := pem.Decode(key)
if len(rest) > 0 {
log.Fatalf("Extra data included in key")
}
if x509.IsEncryptedPEMBlock(block) {
der, err := x509.DecryptPEMBlock(block, password)
if err != nil {
log.Fatalf("Decrypt failed: %v", err)
}
return pem.EncodeToMemory(&pem.Block{Type: block.Type, Bytes: der})
}
return key
}
import "golang.org/x/crypto/ssh"
使用未加密的密钥:
signer, err := ssh.ParsePrivateKey(key)
使用加密密钥:
signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte("password"))
然后:
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
}