2017-02-08 1 views
6

golang ssh와 함께 사용하기 위해 암호화 된 키를 해독하는 방법을 알아낼 수 없기 때문에 포인터를 사용하면 감사하겠습니다. 두 개의 다른 코드 소스 (예 : this)를 함께 매시하려고하지만이 코드를 사용할 수 없습니다. 와golang ssh에서 암호화 된 개인 키를 사용하는 방법

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

:

나는 내가 DER을 받고 있다고 생각하지만, 암호화/SSH와 함께 사용하는 마샬를 위해 PEM이 다시 필요

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

나는 그것을 읽고 암호화되지 않은 (!) 키를 입력하면 다음을 수행 할 수 있습니다.

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.NewSignerFromKey을 키를 구문 분석 x509.ParsePKCS1PrivateKey을 사용하고 ssh.Signer

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

굉장합니다. 고마워요! – DazWilkin

4

난 그냥 허용하는, 여기에 대한 대안을 제공 할거야 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 개인 키", ...}를 {Type : block.Type, ...}으로 변경합니다. "RSA PRIVATE KEY"를 입력하십시오. –

+1

감사! 답변을 변경했습니다. – Madis

관련 문제