如何使用golang ssh加密的私钥

Daz*_*kin 13 ssh go x509

我很感激指针,因为我无法解决如何解密加密密钥以便与golang ssh一起使用它.我正在尝试将两个其他代码源(包括这个代码)混合在一起但无法使其工作.

我想我正在使用DER,但需要将其编组回PEM以便将其与crypto/ssh一起使用

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

我读了它:

key, err := ioutil.ReadFile(privateKey)
if err != nil {
    log.Fatalf("Unable to read private key: %v", err)
}
Run Code Online (Sandbox Code Playgroud)

使用未加密的(!)键,我可以:

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),
    },
}
Run Code Online (Sandbox Code Playgroud)

这会奏效.

我重用了一些代码,我认为解密后的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
}
Run Code Online (Sandbox Code Playgroud)

但是,我如何从DER获得签名者?

或者,解决这个问题的最佳方法是什么?

Jim*_*imB 7

如果您的DER块具有RSA私钥,则x509.ParsePKCS1PrivateKey用于解析密钥,并ssh.NewSignerFromKey获取ssh.Signer

key, err := x509.ParsePKCS1PrivateKey(der)
if err != nil {
    log.Fatal(err)
}
signer := ssh.NewSignerFromKey(key)
Run Code Online (Sandbox Code Playgroud)


Łuk*_*asz 7

import "golang.org/x/crypto/ssh"
Run Code Online (Sandbox Code Playgroud)

使用未加密的密钥:

signer, err := ssh.ParsePrivateKey(key)
Run Code Online (Sandbox Code Playgroud)

使用加密密钥:

signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte("password"))
Run Code Online (Sandbox Code Playgroud)

然后:

config := &ssh.ClientConfig{
    User: username,
    Auth: []ssh.AuthMethod{
        ssh.PublicKeys(signer),
    },
}
Run Code Online (Sandbox Code Playgroud)


Mad*_*dis 6

我将在这里提供一个替代方案,允许重用ssh.ParsePrivateKey(key).我已修改了decrypt对私钥进行解密和编码的功能(如果已加密),并将其返回,以便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
}
Run Code Online (Sandbox Code Playgroud)

  • x509.IsEncryptedPEMBlock 和 x509.DecryptPEMBlock 显示为已弃用且设计上不安全。 (2认同)