2010-07-01 27 views

risposta

28

Se si utilizza ssh-keygen per generare una chiave:

$ ssh-keygen 

allora si può solo usare OpenSSL per estrarre la chiave pubblica e scriverlo nel formato DER come questo:

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

è possibile visualizzare l'output DER come PEM in questo modo:

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

non faccio uso di Ruby, quindi non so quanto sia facile da usare OpenSSL da Ruby.

Modifica: ho risposto troppo velocemente - hai scritto id_rsa.pub e potresti non avere id_rsa. Un'altra domanda di overflow dello stack è per la conversione inversa, ma il codice sorgente trovato potrebbe aiutare: Convert pem key to ssh-rsa format Una volta che hai PEM puoi usare openssl per convertire il PEM in DER.

Modifica, maggio 2014: Ruby è diventato il mio linguaggio di programmazione preferito e la domanda originale (dopo la modifica) ha chiesto informazioni su Ruby. Ecco il codice per leggere l'id_rsa.pub (chiave pubblica) e scrivere un OpenSSL-generated, DER formattato chiave pubblica:

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 } 

È possibile controllare l'output con questi comandi OpenSSL nella shell:

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

Buona soluzione, grazie! –

2

Se avete solo l'accesso alla chiave pubblica generata da ssh-keygen, e si desidera convertirlo in formato DER, i seguenti lavori:

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

Thi s usa per la prima volta ssh-keygen per convertire la chiave in formato PEM PKCS8, quindi usa openssl pkey per convertirlo in formato DER.

(Ciò corrisponde alla risposta di Jim Flood, ma senza toccare il file della chiave privata.)

+0

Ha detto * "Come posso convertire a livello di codice i file id_rsa.pub in chiavi formattate DER RSA?" *. Non ha chiesto comandi per farlo. – jww

+0

Inoltre, non funziona su tutte le distro –

Problemi correlati