2017-02-08 26 views
6

Tôi sẽ đánh giá cao con trỏ vì tôi không thể tìm ra cách giải mã khóa được mã hóa để sử dụng khóa đó với golang ssh. Tôi đang cố gắng để trộn lẫn với nhau hai nguồn khác của mã (bao gồm cả this một) nhưng không thể có được điều này để làm việc.Cách sử dụng khóa riêng được mã hóa với golang ssh

Tôi nghĩ rằng tôi nhận được đến một DER nhưng cần phải marshall trở lại này để PEM để sử dụng nó với crypto/ssh

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

Tôi đọc nó:

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

Với một khóa không được mã hóa (!), tôi có thể:

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

Và điều này sẽ hiệu quả.

tôi tái sử dụng một số mã mà tôi nghĩ được tôi PEM giải mã như một 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 
} 

Nhưng, làm thế nào để tôi nhận được từ các DER để một người ký?

Hoặc cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

4

Nếu bạn có khối DER với một khóa bí mật RSA, bạn sử dụng để phân tích x509.ParsePKCS1PrivateKey chìa khóa, và ssh.NewSignerFromKey để có được những ssh.Signer

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

Tuyệt vời. Cảm ơn nhiều! – DazWilkin

4

tôi chỉ cần đi để cung cấp một sự lựa chọn ở đây, cho phép để sử dụng lại số ssh.ParsePrivateKey(key). Tôi đã sửa đổi chức năng decrypt để giải mã và mã hóa khóa cá nhân, nếu nó được mã hóa và trả lại, sao cho trả lại key có thể được sử dụng trực tiếp trong ssh.ParsePrivateKey(key). Nó sử dụng pem.EncodeToMemory để lấy khóa từ khối PEM đã được giải mã.

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

Tôi muốn thay đổi {Code: "RSA PRIVATE KEY", ...} thành {Type: block.Type, ...} vì đoạn mã này sẽ vô tình thay đổi loại khối PEM nếu khối đầu vào không phải là của nhập "RSA PRIVATE KEY". –

+1

Cảm ơn! Đã thực hiện thay đổi đối với câu trả lời. – Madis

Các vấn đề liên quan