2017-02-08 9 views
6

暗号化された鍵を復号化してgolang sshで使用する方法がわからないので、参考にしてください。私は2つのコードソース(thisを含む)を一緒にマッシュしようとしていますが、これを動作させることはできません。golang sshで暗号化された秘密鍵を使用する方法

私はそれを読んで暗号/ SSH

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326 
... 
-----END RSA PRIVATE KEY----- 

でそれを使用するために、私はDERになっていると思うが、マーシャルにPEMに、このバックが必要になりますと

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), 
    }, 
} 

これは機能します。私は署名者への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として私に復号化されたPEMを取得すると思ういくつかのコードを再利用しましたか?

または、これを解決するにはどうすればよいですか?

答えて

4

あなたはRSA秘密鍵でDERブロックを持っている場合は、あなたがssh.Signer

key, err := x509.ParsePKCS1PrivateKey(der) 
if err != nil { 
    log.Fatal(err) 
} 
signer := ssh.NewSignerFromKey(key) 
+0

驚くばかりです。どうもありがとうございました! – DazWilkin

4

を取得するには、キーを解析するx509.ParsePKCS1PrivateKeyを使用し、ssh.NewSignerFromKey私はちょうど可能にし、ここで代替を提供するつもりですssh.ParsePrivateKey(key)を再利用してください。私はdecrypt関数を変更して、秘密鍵が暗号化されていればそれを復号化してエンコードし、返されたkeyssh.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 
} 
+1

入力ブロックがそうでない場合、このコードスニペットが誤ってPEMブロックタイプを変更するため、{type: "RSA PRIVATE KEY"、...}を{Type:block.Type、...}に変更します「RSAプライベートキー」と入力します。 –

+1

ありがとう!答えに変更を加えました。 – Madis

関連する問題