2011-01-20 1 views
5

Я пытаюсь загрузить конкретный закрытый ключ, закодированный в двоичном формате DER (PKCS#8) в Ruby.Загрузите двоичный ключ PKCS # 8 в Ruby

Однако OpenSSL::PKey не узнает об этом. Я могу заставить его работать, делая некоторые консольную работу и превращая его в PEM как так:

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

После этого ключ правильно может быть прочитан.

Однако, поскольку я хотел бы, чтобы весь процесс выполнялся в памяти вместо того, чтобы писать и читать файлы.

Итак, мой вопрос: возможно ли загружать секретные ключи из двоичного кодированного формата DER в Ruby/OpenSSL?

Спасибо за ваше время,

Фернандо

ответ

0

сертификат способен обрабатывать DER-закодированные сертификаты и сертификаты, закодированные в формате PEM OpenSSL,.

Вы можете найти документацию по реализации OpenSSL для Руби here:

+0

Это неверно. Для PEM источник Ruby вызывает PEM_read_bio_RSAPrivateKey, который вызывает PEM_read_bio_PrivateKey, что да, обрабатывает PKCS # 8. Однако, когда DER, источник Ruby вызывает d2i_RSAPrivateKey_bio, который вызывает 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 , версия, LONG), ...), которая будет * не * читать PKCS # 8. DK-кодированный PKCS # 8 * не может быть загружен напрямую с помощью OpenSSL :: PKey :: RSA.new. –

+0

Мой плохой. Я не знал, что реализация OpenSSL в ruby ​​отличается от того, что сказано в документации OpenSSL ... –

2

Да, вы можете косвенно нагрузки PKCS # 8 DER-закодированные закрытых ключей с использованием Ruby-OpenSSL.

OpenSSL::PKey::RSA.new будет обрабатывать только PKCS # 8 с PEM-форматированием, но легко прочитать двоичный DER и преобразовать его в строку в формате PEM, а затем загрузить из строки.

Например, с этими DER-закодированные секретными ключами:

$ 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 

Вы можете сделать что-то вроде этого:

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') 

Прочитайте DER байт, Base64 их и положить теги PEM сверху и снизу, а затем загрузите ключ.