2011-01-20 36 views
5

Tôi đang cố tải khóa riêng tư được mã hóa ở định dạng nhị phân DER (PKCS#8) vào Ruby.Tải khóa nhị phân PKCS # 8 vào Ruby

Tuy nhiên, OpenSSL::PKey sẽ không nhận ra. Tôi có thể làm cho nó hoạt động bằng cách làm một số công việc điều khiển và biến nó thành một PEM như vậy:

openssl pkcs8 -inform DER -in file.key -passin pass:xxxxxxxx >private_key.pem 

Sau này, chìa khóa một cách chính xác có thể được đọc.

Tuy nhiên, vì tôi muốn toàn bộ quá trình được thực hiện trong bộ nhớ thay vì viết và đọc tệp.

Vì vậy, câu hỏi của tôi là: Có thể tải khóa riêng tư từ định dạng mã hóa nhị phân DER vào Ruby/OpenSSL không?

Cảm ơn bạn đã dành thời gian,

Fernando

Trả lời

0

Giấy chứng nhận có khả năng xử lý giấy chứng nhận DER-mã hóa và chứng chỉ được mã hóa ở định dạng PEM OpenSSL của.

Bạn có thể tìm tài liệu về thực hiện OpenSSL cho Ruby here:

+0

Điều đó không đúng. Đối với PEM, nguồn Ruby gọi PEM_read_bio_RSAPrivateKey, gọi PEM_read_bio_PrivateKey, có, xử lý PKCS # 8. Tuy nhiên, khi DER, nguồn Ruby gọi d2i_RSAPrivateKey_bio, gọi là ASN1_item_i2d_bio (ASN1_ITEM_rptr (RSAPrivateKey), bp, rsa) (openssl-1.0.1m/crypto/rsa/rsa_asn1.c: ASN1_SEQUENCE_cb (RSAPrivateKey, rsa_cb) = {ASN1_SIMPLE (RSA) , phiên bản, LONG), ...) sẽ * không * đọc PKCS # 8. PKCS # 8 * được mã hóa bằng DER không thể được tải trực tiếp bằng OpenSSL :: PKey :: RSA.new. –

+0

Tệ của tôi. Tôi không biết rằng việc triển khai OpenSSL trong ruby ​​khác với những gì được nói trong tài liệu OpenSSL ... –

2

Vâng, bạn có thể gián tiếp tải PKCS # 8 phím riêng DER-mã hóa sử dụng của Ruby OpenSSL.

OpenSSL::PKey::RSA.new sẽ chỉ xử lý tệp PKCS # 8 được định dạng PEM, nhưng dễ đọc DER nhị phân và chuyển đổi thành chuỗi được định dạng PEM và sau đó tải từ chuỗi.

Ví dụ, với các phím riêng DER-mã hóa:

$ openssl genrsa | openssl pkcs8 -topk8 -outform DER \ 
    -nocrypt -out pkcs8.key 
$ openssl genrsa | openssl pkcs8 -topk8 -outform DER \ 
    -v2 des3 -passout pass:secret -out pkcs8_des3.key 

Bạn có thể làm một cái gì đó như thế này:

require 'openssl' 
require 'base64' 

def box(tag, lines) 
    lines.unshift "-----BEGIN #{tag}-----" 
    lines.push "-----END #{tag}-----" 
    lines.join("\n") 
end 

def der_to_pem(tag, der) 
    box tag, Base64.strict_encode64(der).scan(/.{1,64}/) 
end 

pem = der_to_pem('PRIVATE KEY', File.read('pkcs8.key')) 
key = OpenSSL::PKey::RSA.new(pem) 

pem2 = der_to_pem('ENCRYPTED PRIVATE KEY', File.read('pkcs8_des3.key')) 
key2 = OpenSSL::PKey::RSA.new(pem2, 'secret') 

Đọc byte DER, Base64 họ và đặt các thẻ PEM trên đầu trang và cuối cùng, sau đó tải khóa.

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