2010-07-01 26 views

Respuesta

28

Si usa ssh-keygen para generar una clave:

$ ssh-keygen 

a continuación, puedes usar OpenSSL para extraer la clave pública y escribir en el formato DER así:

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

puede ver la salida DER como PEM como esta:

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

no consumo Ruby, así que no sé lo fácil que es utilizar OpenSSL de Ruby.

Editar: Respondí muy rápido: escribió id_rsa.pub y es posible que no tenga el ID_rsa. Otra pregunta sobre el desbordamiento de pila corresponde a la conversión inversa, pero el código fuente que se encuentra allí podría ayudar: Convert pem key to ssh-rsa format Una vez que tenga PEM, puede usar openssl para convertir el PEM en 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) le preguntó acerca de Ruby. Aquí está el código para leer el id_rsa.pub (clave pública) y escribir una, clave generada OpenSSL-DER-formateado pública:

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 } 

Puede comprobar la salida con estos comandos openssl en la cáscara:

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

¡Buena solución, gracias! –

2

Si sólo tiene acceso a la clave pública generada por ssh-keygen, y desea convertirlo a formato DER, las siguientes obras:

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

Thi s primero usa ssh-keygen para convertir la clave al formato PKCS8 PEM, luego usa openssl pkey para convertir eso al formato DER.

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

+0

Dijo * "¿Cómo puedo convertir programáticamente archivos id_rsa.pub a claves formateadas RSA DER?" *. Él no pidió órdenes para hacerlo. – jww

+0

Además, no funciona en todas las distribuciones –

Cuestiones relacionadas