ver usar herramienta generar crear convertir con como comandos certificado openssl rsa

openssl - usar - Convertir la clave pública RSA a RSA DER



herramienta openssl (2)

Tengo la clave id_rsa.pub generada por ssh-keygen. ¿Cómo puedo convertir mediante programación los archivos id_rsa.pub a claves formateadas RSA DER?


Si solo tiene acceso a la clave pública generada por ssh-keygen y desea convertirla al formato DER, lo siguiente funciona:

ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER

Este primero usa ssh-keygen para convertir la clave al formato PKCS8 PEM, luego usa openssl pkey para convertirlo al formato DER.

(Esto logra lo mismo que la respuesta de Jim Flood, pero sin tocar el archivo de clave privada).


Si usas ssh-keygen para generar una clave:

$ ssh-keygen

Luego, puede usar openssl para extraer la clave pública y escribirla en el formato DER de esta manera:

$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout writing RSA key

Puedes ver la salida de DER como PEM así:

$ openssl rsa -in pub.der -inform DER -pubin -text

No uso Ruby, por lo que no sé lo fácil que es usar OpenSSL de Ruby.

Edición: respondí demasiado rápido: usted escribió id_rsa.pub y es posible que no tenga el id_rsa en sí. Otra pregunta sobre el desbordamiento de pila es para la conversión inversa, pero el código fuente encontrado allí podría ayudar: Convertir la clave pem al formato ssh-rsa Una vez que tenga PEM, puede usar openssl para convertir el PEM a DER.

Edición, mayo de 2014: Ruby se ha convertido en mi lenguaje de programación favorito, y la pregunta original (desde su edición) pregunta sobre Ruby. Aquí está el código para leer el id_rsa.pub (clave pública) y escribir una clave pública con formato DER, generada por OpenSSL:

require ''openssl'' require ''base64'' def read_length(s) # four bytes, big-endian length = s[0..3].unpack(''N'')[0] end def read_integer(s, length) # shift all bytes into one integer s[4..3 + length].unpack(''C*'').inject { |n, b| (n << 8) + b } end def cut(s, length) s[4 + length..-1] end def decode_pub(pub) # the second field is the Base64 piece needed s = Base64.decode64(pub.split[1]) # first field reading "ssh-rsa" is ignored i = read_length(s) s = cut(s, i) # public exponent e i = read_length(s) e = read_integer(s, i) s = cut(s, i) # modulus n i = read_length(s) n = read_integer(s, i) [ e, n ] end def make_asn1(e, n) # Simple RSA public key in ASN.1 e0 = OpenSSL::ASN1::Integer.new(e) n1 = OpenSSL::ASN1::Integer.new(n) OpenSSL::ASN1::Sequence.new([ e0, n1 ]) end pub = File.read(''id_rsa.pub'') asn1 = make_asn1(*decode_pub(pub)) # Let OpenSSL deal with converting from the simple ASN.1 key = OpenSSL::PKey::RSA.new(asn1.to_der) # Write out the public key in both PEM and DER formats File.open(''id_rsa.pem'', ''w'') { |f| f.write key.to_pem } File.open(''id_rsa.der'', ''w'') { |f| f.write key.to_der }

Puedes verificar la salida con estos comandos openssl en el shell:

$ openssl rsa -pubin -text -in id_rsa.pem $ openssl rsa -pubin -text -inform DER -in id_rsa.der