Estrarre la chiave pubblica / privata dal file PKCS12 per un uso successivo nell'autenticazione SSH-PK


194

Voglio estrarre la chiave pubblica e privata dal mio PKCS#12file per un uso successivo in SSH-Public-Key-Authentication.

In questo momento, sto generando le chiavi tramite ssh-keygen in cui ho inserito .ssh/authorized_key, rispettivamente da qualche parte sul lato client.

In futuro, voglio usare le chiavi da un PKCS#12contenitore, quindi devo prima estrarre la chiave pubblica PKCS#12e poi inserirla nel .ssh/authorized_keysfile. C'è qualche possibilità per farlo funzionare openssl? Le chiavi sono PKCS#12compatibili per l'autenticazione ssh-public-key?

Risposte:


285

È possibile utilizzare i seguenti comandi per estrarre la chiave pubblica / privata da un contenitore PKCS # 12:

  • Chiave privata n. 1 PKCS

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • certificati:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
i comandi funzionano, ma la chiave privata viene esportata come formato PKCS1 e ho bisogno di PKCS8 ... C'è qualche opzione che mi manca per ottenerlo? Ad esempio, esporta '----- INIZIA CHIAVE PRIVATA RSA -----' ma ho bisogno '-----
INIZIA

4
Per farlo potresti provareopenssl rsa -in privateKey.pem -out private.pem
Francois,

28
@edthethird: per ottenere PKCS8, aggiungi la bandiera -nodes
Christopher K.

7
Per esportare senza password, aggiungi -passout pass:. Si aspetta che il parametro sia nel form pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK. Grazie! quello era quello buono per me. aggiungendo -nodesesporta correttamente la chiave
TecHunter

85

Questo è possibile con un po 'di conversione del formato.

Per estrarre la chiave privata in un formato openssh può usare:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Per convertire la chiave privata in una chiave pubblica:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Per estrarre la chiave pubblica in un formato openssh può usare:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
Grazie! La prima riga era quella di cui avevo bisogno. Solo la chiave, non crittografata, quindi può essere installata tramite la maggior parte dei sistemi automatizzati di CDN.
BTC,

1
@PhilipRego Penso che tu abbia le chiavi pubbliche e private confuse. Una chiave pubblica RSA ha due valori, "e" l'esponente pubblico e "n" il modulo - entrambi i quali sono memorizzati lungo le parti private della chiave.
Ryanc,

17

OpenSSH non può usare i file PKCS # 12 per impostazione predefinita. Come altri hanno suggerito, è necessario estrarre la chiave privata in formato PEM che ti porta dalla terra di OpenSSL a OpenSSH. Altre soluzioni menzionate qui non funzionano per me. Uso OS X 10.9 Mavericks (al momento 10.9.3) con utility "preconfezionate" (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Innanzitutto, estrarre una chiave privata in formato PEM che verrà utilizzata direttamente da OpenSSH:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Consiglio vivamente di crittografare la chiave privata con password:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Ovviamente, anche scrivere una password in chiaro sulla riga di comando non è sicuro, quindi dovresti eliminare l'ultimo comando dalla cronologia o semplicemente assicurarti che non ci arrivi. Conchiglie diverse hanno modi diversi. È possibile aggiungere un prefisso al comando con spazio per impedire che venga salvato nella cronologia in Bash e in molte altre shell. Ecco anche come eliminare il comando dalla cronologia in Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

In alternativa, è possibile utilizzare un modo diverso per passare una password della chiave privata a OpenSSL: consultare la documentazione di OpenSSL per argomenti relativi a passphrase .

Quindi, crea una chiave pubblica OpenSSH che può essere aggiunta al file authorized_keys:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

A cosa | openssl rsaservono le cose?
Snekse,

1
@Snekse si assicura che ci sia solo chiave privata nell'output. Nel mio caso, crea un file di identità ( ~/.ssh/id_rsa) con qualche "cruft" come Bag Attributes senza `| openssl rsa`. Immagino che OpenSSH e altre utility che utilizzano il file di identità possano gestire quella cruft (non l'ho provato), ma sono semplicemente abituato a fornire solo i dati necessari e niente di più, soprattutto se si tratta di sicurezza.
dal

1
Questa risposta ha funzionato per me per ottenere l'accesso alla chiave privata in formato PEM nel terminale, che sono stato in grado di copiare / incollare: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

Soluzione 1:

Estrarre P12 da jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Estrai PEM da P12 e modifica file e pem da file crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Estrai chiave da jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Soluzione 2:

Estrai PEM e crittografatoPrivateKey nel file txt```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Decifrare privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
Quando si risponde alle domande aiuta a evidenziare quali sono i comandi. Puoi farlo aggiungendo tre backquotes prima e dopo il comando in modo che `` ciao eco '' diventi echo hello.
PatS

2

Aggiornamento: ho notato che la mia risposta era solo un povero duplicato di una domanda ben spiegata su https: //unix.stackexchange.com / ... di BryKKan

Ecco un estratto da esso:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

3
L'aggiunta di alcune spiegazioni renderebbe questa risposta più utile.
mx0

0

Per quanto ne so, PKCS # 12 è solo un archivio di chiavi certificato / pubblico / privato. Se hai estratto una chiave pubblica dal file PKCS # 12, OpenSSH dovrebbe essere in grado di usarla fintanto che è stata estratta in formato PEM . Probabilmente sai già che hai bisogno anche di una corrispondente chiave privata (anche in PEM ) per usarla per l'autenticazione ssh-public-key.


0

La risposta accettata è il comando corretto, voglio solo aggiungere un'altra cosa, quando si estrae la chiave se si lascia "Enter PEM pass phrase:"vuota la password PEM ( ), la chiave completa non verrà estratta ma localKeyIDverrà estratta solo. Per ottenere la chiave completa è necessario specificare una password PEM che esegue il comando seguente.

Si noti che quando si tratta di importare la password, è possibile specificare la password effettiva per "Enter Import Password:"o lasciare vuota questa password:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
Questo dovrebbe essere un commento alla risposta accettata, non la risposta.
Styx,
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.