2017-02-08 19 views
6

Я был бы признателен за указатели, потому что я не могу решить, как расшифровать зашифрованный ключ, чтобы использовать его с golang ssh. Я пытаюсь смять два других источника кода (включая this), но не смог заставить это работать.Как использовать зашифрованный закрытый ключ с golang ssh

Я думаю, что я к DER, но нужно Маршаллу это обратно в PEM для того, чтобы использовать его с криптографической/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 к подписавшимся?

Или, что является лучшим способом решить эту проблему?

ответ

4

Если у вас есть блок DER с закрытым ключом RSA, можно использовать x509.ParsePKCS1PrivateKey разобрать ключ и ssh.NewSignerFromKey получить ssh.Signer

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

Awesome. Большое спасибо! – DazWilkin

4

Я просто хочу, чтобы обеспечить альтернативу здесь, что позволяет для повторного использования 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 
} 
+1

Я бы изменил hardcoded {Type: "RSA PRIVATE KEY", ...} на {Type: block.Type, ...}, потому что этот фрагмент кода случайно изменит тип блока PEM, если входной блок не соответствует введите «RSA PRIVATE KEY». –

+1

Спасибо! Сделал изменения в ответе. – Madis

 Смежные вопросы

  • Нет связанных вопросов^_^