2011-01-20 16 views
5

Estoy intentando cargar una clave privada particular codificada en el formato DER binario (PKCS#8) en Ruby.Cargue la clave binaria PKCS # 8 en Ruby

Sin embargo, OpenSSL::PKey no lo reconocerá. Puedo hacer que funcione por hacer algún trabajo de la consola y transformándolo en un PEM así:

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

Después de esto, la clave correcta se puede leer.

Sin embargo, dado que me gustaría que todo el proceso se realice en la memoria en lugar de escribir y leer archivos.

Entonces mi pregunta es: ¿es posible cargar claves privadas del formato DER codificado en binario en Ruby/OpenSSL?

Gracias por su tiempo,

Fernando

Respuesta

0

certificado es capaz de manejar certificados y certificados codificados en DER codificados en formato PEM de OpenSSL.

Se puede encontrar documentación acerca de la implementación de OpenSSL para Ruby here:

+0

Eso es incorrecto. Para PEM, la fuente de Ruby llama a PEM_read_bio_RSAPrivateKey, que llama a PEM_read_bio_PrivateKey, que sí, maneja PKCS # 8. Sin embargo, cuando DER, la fuente de Ruby llama a d2i_RSAPrivateKey_bio, que llama 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) , versión, LONG), ...) que * no * leerá PKCS # 8. El PKCS # 8 * con codificación DER no se puede cargar directamente usando OpenSSL :: PKey :: RSA.new. –

+0

Mi mal. No sabía que la implementación de OpenSSL en ruby ​​era diferente de lo que se dice en la documentación de OpenSSL ... –

2

Sí, se puede indirectamente PKCS # 8 carga de claves privadas codificados en DER utilizando Rubí OpenSSL.

OpenSSL::PKey::RSA.new solo manejará PKCS # 8 con formato PEM, pero es fácil leer el DER binario y convertirlo en una cadena con formato PEM y luego cargar desde la cadena.

Por ejemplo, con estas claves privadas codificados en 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 

se puede hacer algo como esto:

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

Leer los bytes de DER, Base64 y poner las etiquetas de PEM en la parte superior y abajo, y luego cargue la llave.

Cuestiones relacionadas