Come posso convertire una chiave pubblica ssh-keygen in un formato che consuma la funzione PEM_read_bio_RSA_PUBKEY ()?


49

Sto riscontrando un problema durante la generazione di una chiave pubblica che la PEM_read_bio_RSA_PUBKEY()funzione openssl può utilizzare. Continuo a ricevere errori.

Ovviamente non posso semplicemente usare la stringa ASCII nel ssh-keygen <>.pubfile chiave in quanto è nel formato di file SSH o forse SubjectPublicKeyInfostruttura.

Ecco il codice gen chiave: ssh-keygen -t rsa -b 1024 -C "Test Key"

Ho trovato un convertitore in php sul web che convertirà il contenuto della chiave pubblica in un formato stringa ASCII PEM base64. Tuttavia, la funzione non piace ancora.

La documentazione di Openssl afferma:

  1. "Funzione RSA_PUBKEY () che elabora una chiave pubblica utilizzando una struttura EVP_PKEY"
  2. "Le funzioni RSA_PUBKEY elaborano anche una chiave pubblica RSA utilizzando una struttura RSA"

Come posso ottenere la mia chiave pubblica OpenSSH in entrambi i formati che la funzione OpenSSL la utilizzerà?


Capito questo: usa lo strumento openssl solo come tale:
PeteP

Crea chiave privata: openssl genrsa -out test.priv.key 2048; Chiave pubblica di output nello stesso formato (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP

Risposte:


57

OK!

Così sono entrato in questo pensiero "Facile, ho capito." Si scopre che c'è molto di più rispetto a quanto pensassi.

Quindi il primo problema è che (secondo le pagine man di OpenSSL (man 3 pem)), OpenSSL si aspetta che la chiave RSA sia nel formato PKCS # 1. Chiaramente questo non è ciò con cui ssh-keygen sta lavorando. Hai due opzioni (dalla ricerca in giro).

Se hai OpenSSH v. 5.6 o successivo (non l'ho fatto sul mio laptop), puoi eseguire questo:

ssh-keygen -f key.pub -e -m pem

Il metodo più lungo per farlo è quello di suddividere la tua chiave SSH in vari componenti (la voce del blog che ho trovato parte di questo accusa OpenSSH di essere "proprietaria", preferisco chiamarla "unica") e quindi utilizzare una libreria ASN1 per scambiare cose.

Fortunatamente per te, qualcuno ha scritto il codice per fare questo:

https://gist.github.com/1024558


9
Il ssh-keygenmetodo sembra funzionare su Linux ma non su Mac OS X.
lid

3
Coperchio, vedere la nota nella risposta sulla versione SSH. OS X non distribuisce una versione recente di OpenSSH. Eseguire il comando ssh -V.
Brian Redbeard,

3
Non funziona OpenSSH_6.2p2. Funziona dentro OpenSSH_6.6p1.
Vecchio professionista

-mnon funziona per me ... qual è il lavoro in giro?
Pstanton,

2
Funziona per me su Mac!
Greg Hornby,

18

Supponendo di avere la chiave privata SSH id_rsa, è possibile estrarre la chiave pubblica da essa in questo modo:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Mi rendo conto che l'OP ha chiesto di convertire una chiave pubblica, quindi questo non risponde alla domanda, tuttavia ho pensato che sarebbe stato utile ad alcuni comunque.

Si noti inoltre che questo comando genera un formato di chiave pubblica PEM, che è generalmente ciò che OpenSSL si aspetta. La risposta di Brian, d'altra parte, si traduce in un file in formato RSAPublicKey, che non è il formato normale previsto da OpenSSL (sebbene le versioni successive possano apparentemente leggerlo tramite il -RSAPublicKey_inflag). Per convertire puoi fare questo:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem

Grazie, il -pubout dalla chiave privata ha fatto il trucco per me.
Shaun Dewberry,

openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemfunziona anche (ovvero l'input è una chiave privata in formato pem). Buona risposta.
Johnny Wong,

1
Aggiornamento: La risposta di Brian è stato corretto per -m pkcs8la quale, nonostante la gente OpenSSH utilizzando il nome sbagliato fa produce X.509 'pubkey'. Inoltre, dal momento che OpenSSH 6.5 nel 2014-01 se il creatore ha specificato 'nuovo formato' -oper una migliore sicurezza, questo metodo non funzionerà e dal 7,8 nel 2018-08 il 'nuovo formato' è ora predefinito, idem.
dave_thompson_085

11

Il formato che desideri è ciò che ssh-keygenchiama PKCS8. Quindi il seguente comando produrrà l'output desiderato:

ssh-keygen -f key.pub -e -m pkcs8

Dalla ssh-keygenpagina man:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.

Questo in realtà funziona su Linux e macOS.
Jay Taylor,

per estrarre la chiave pubblica generata equivalente dalla chiave privata in OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd

6

Simile al metodo di Amal Chaudhuri di seguito, questo è ciò che ha funzionato per me. Avevo bisogno di creare un file pem dalla chiave pubblica ssh che avevo generato per il mio client SFTP (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

questo in realtà non sembra funzionare.
fuori2344 il

5
Questo funziona SOLO per chiave RSA privata NON richiesta dalla chiave pubblica OP. Quindi risposta sbagliata.
Devy,

3
In realtà, id_rsagià è nel formato giusto, puoi verificarlo da solo, il risultato id_rsa.pemè identico al 100%.
Miro Kropacek,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.