Загрузите двоичный ключ PKCS # 8 в Ruby - PullRequest
8 голосов
/ 21 января 2011

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

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

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

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

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

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

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

Fernando

Ответы [ 2 ]

4 голосов
/ 19 сентября 2015

Да, вы можете косвенно загрузить 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 сверху и снизу, а затем загрузите ключ.

0 голосов
/ 17 декабря 2013

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

Документацию по реализации OpenSSL для Ruby можно найти здесь :

...