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