Conversione di chiavi tra openssl e openssh

47

Se utilizzo il seguente

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

Ottengo private.pem e public.pem

Se utilizzo

ssh-keygen -t rsa -f rsa

Ottengo rsa e rsa.pub

È possibile convertire dal formato di rsa a private.pem e vice-a-versa?

Modifica: per essere più specifici,

a) Se ho il private.pem e public.pem generato dal comando precedente, come faccio a ottenere l'equivalente chiave privata rsa e la chiave pubblica?

b) Dato il rsa e il rsa.pub , come ottengo le chiavi x509 se conosco i metadati aggiuntivi che il comando openssl sopra contiene?

Se vado dal formato openssh a x509 e viceversa, dovrei idealmente recuperare lo stesso file chiave.

    
posta anshul 18.03.2013 - 13:07
fonte

6 risposte

33

Ti manca un po 'qui.

ssh-keygen può essere utilizzato per convertire chiavi pubbliche da formati SSH in formati PEM adatti per OpenSSL. Le chiavi private sono normalmente già memorizzate in un formato PEM adatto per entrambi.

Tuttavia, il comando OpenSSL che mostri genera un certificato autofirmato . Questo certificato non è qualcosa che OpenSSH usa tradizionalmente per qualcosa - e sicuramente non è la stessa cosa di una chiave pubblica.

OpenSSH ha anche il supporto per i certificati, ma è probabile che tu non stia utilizzando questo supporto. Inoltre, questi certificati non sono X.509, quindi sono incompatibili con OpenSSL.

Il certificato contiene informazioni che non sono presenti altrove e ogni certificato è unico e non può essere ricreato a piacimento. Ciò significa che è necessario memorizzare il certificato X.509, oltre alla chiave privata, se si desidera utilizzare la stessa chiave per OpenSSL e OpenSSH.

Se vuoi solo condividere la chiave privata, la chiave OpenSSL generata dal tuo comando di esempio è memorizzata in private.pem , e dovrebbe già essere in formato PEM compatibile con (recente) OpenSSH. Per estrarre una chiave pubblica compatibile OpenSSH, è sufficiente eseguire:

ssh-keygen -f private.pem -y > private.pub

Se vuoi iniziare da OpenSSH e passare al lato OpenSSL, con un certificato autofirmato (per qualsiasi motivo), ecco come:

$ ssh-keygen -f test-user
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in test-user.
Your public key has been saved in test-user.pub.
The key fingerprint is:
ff:36:f1:74:c7:0d:4e:da:79:5c:96:27:2c:2c:4e:b6 naked@tink
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|           . .  .|
|          + o =.+|
|        S+ o * B+|
|         .E o = B|
|          .  + o.|
|           .o .  |
|           ...   |
+-----------------+
$ openssl req -x509 -days 365 -new -key test-user -out test-user-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
$ ls -l test-user*
-rw------- 1 naked naked 1675 Mar 18 21:52 test-user
-rw-r--r-- 1 naked naked 1229 Mar 18 21:53 test-user-cert.pem
-rw-r--r-- 1 naked naked  392 Mar 18 21:52 test-user.pub

Da questi, entrambi i file test-user e test-user-cert.pem sono fondamentali da conservare, dove come test-user.pub è sempre possibile ricreare dall'utente test come richiesto.

    
risposta data 18.03.2013 - 13:53
fonte
32

Lo strumento ssh-keygen di openssh può farlo per te.

Il seguente comando convertirà il file .pub nel formato pem per te.

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

Il ssh-keygen supporta anche la conversione in vari altri formati, per ulteriori informazioni, vedi man pagina.

    
risposta data 18.03.2013 - 13:12
fonte
5

Le versioni più recenti di OpenSSL (almeno per > = 1.0.1) utilizzano il formato PKCS # 8 per le chiavi.

Quindi, se estrai la chiave publick dal certificato usando il comando

openssl x509 -in certificate.pem -noout -pubkey >pubkey.pem

È necessario utilizzare il seguente comando per convertirlo nella voce authorized_keys

ssh-keygen -i -m PKCS8 -f pubkey.pem
L'opzione

-out del comando req di OpenSSL produce la richiesta di certificato piuttosto che la chiave pubblica.

Per estrarre la chiave pubblica nel formato PKCS # 8, comprensibile per la funzione di importazione di ssh-keygen usa il seguente comando.

openssl req -in public.pem -noout -pubkey
    
risposta data 02.07.2015 - 12:04
fonte
3

Una chiave RSA pubblica a 2048 bit può essere convertita dal formato X.509 PEM in formato OpenSSH con i seguenti comandi (cfr. risposta ). Non sarebbe difficile scrivere la conversione nell'altra direzione in base alle informazioni fornite dalla risposta collegata.

echo -n "ssh-rsa " > rsa2048.pub
grep -v -- ----- rsa2048.pem | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> rsa2048.pub
echo >> rsa2048.pub
    
risposta data 22.01.2014 - 19:11
fonte
1

Sono riuscito a utilizzare lo strumento di windows puttygen.exe per questo:

  1. Carica la tua chiave privata in puttygen (risposta passphrase challenge)
  2. Una volta caricato, seleziona come nell'immagine sopra Conversioni - > Esporta chiave OpenSSH dargli un nome e dovrebbe funzionare, ha funzionato solo per me.
risposta data 10.10.2017 - 12:10
fonte
0

Non sono riuscito a trovare uno strumento per il lavoro, quindi mi sono sporcato le mani e ne ho scritti alcuni a mano leggendo il codice sorgente OpenSSH e alcuni debugger PEM / DER online.

L'ho scritto per convertire tra PKCS8, PKCS1 (solo RSA), SEC1 (solo ECDSA) e il formato "proprietario" OpenSSH per chiavi RSA di qualsiasi dimensione e ECDSA P-256 e P-384.

install

È scritto per node.js (e sto lavorando per portarlo sul browser), quindi devi installarlo per primo:

E poi:

npm install -g rasha eckles ssh-to-jwk jwk-to-ssh

Rasha è per RSA, Eckles è per ECDSA.

PEM in OpenSSH

RSA

rasha privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_rsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_rsa.pub

ECDSA

eckles privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_ecdsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_ecdsa.pub

OpenSSH in PEM

RSA

ssh-to-jwk id_rsa > privkey.jwk.json

rasha privkey.jwk.json > privkey.pem

rasha privkey.jwk.json public > pubkey.pem

ECDSA

ssh-to-jwk id_ecdsa > privkey.jwk.json

eckles privkey.jwk.json > privkey.pem

eckles privkey.jwk.json public > pubkey.pem
    
risposta data 12.12.2018 - 18:25
fonte

Leggi altre domande sui tag