Extrahieren Sie den öffentlichen / privaten Schlüssel aus der PKCS12-Datei zur späteren Verwendung in der SSH-PK-Authentifizierung


194

Ich möchte den öffentlichen und privaten Schlüssel aus meiner PKCS#12Datei extrahieren, um ihn später für die SSH-Authentifizierung mit öffentlichem Schlüssel zu verwenden.

Im Moment generiere ich Schlüssel über ssh-keygen, die ich .ssh/authorized_keyirgendwo auf der Clientseite eingebe.

In Zukunft möchte ich die Schlüssel aus einem PKCS#12Container verwenden, daher muss ich zuerst den öffentlichen Schlüssel extrahieren PKCS#12und dann in die .ssh/authorized_keysDatei einfügen. Gibt es eine Chance, dies zum Laufen zu bringen openssl? Sind die Schlüssel PKCS#12für die Authentifizierung mit ssh-public-key kompatibel?

Antworten:


282

Mit den folgenden Befehlen können Sie den öffentlichen / privaten Schlüssel aus einem PKCS # 12-Container extrahieren:

  • PKCS # 1 Privater Schlüssel

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

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

7
Die Befehle funktionieren, aber der private Schlüssel wird als PKCS1-Format exportiert und ich benötige PKCS8 ... Gibt es eine Option, die mir fehlt, um dies zu erhalten? Zum Beispiel exportiert es ----- BEGIN RSA PRIVATE KEY ----- 'aber ich brauche '----- PRIVATE KEY BEGIN -----'
edthethird

4
Um das zu tun, könnten Sie versuchenopenssl rsa -in privateKey.pem -out private.pem
Francois

27
@edthethird: Um PKCS8 zu erhalten, fügen Sie das Flag -nodes hinzu
Christopher K.

7
Um ohne Passwort zu exportieren, fügen Sie hinzu -passout pass:. Es wird erwartet, dass der Parameter im Formular pass: mypassword vorliegt. stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK. Vielen Dank! das war das gute für mich. Hinzufügen von -nodesExporten der Schlüssel richtig
TecHunter

85

Dies ist mit ein wenig Formatkonvertierung möglich.

Um den privaten Schlüssel in einem Format zu extrahieren, kann openssh Folgendes verwenden:

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

So konvertieren Sie den privaten Schlüssel in einen öffentlichen Schlüssel:

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

Um den öffentlichen Schlüssel in einem Format zu extrahieren, kann openssh Folgendes verwenden:

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

2
Danke dir! Die erste Zeile war die, die ich brauchte. Nur der Schlüssel, unverschlüsselt, damit er über die meisten automatisierten CDN-Systeme installiert werden kann.
BTC

1
@PhilipRego Ich denke, Sie haben öffentliche und private Schlüssel verwirrt. Ein öffentlicher RSA-Schlüssel besteht aus zwei Werten, dem öffentlichen Exponenten 'e' und dem Modul 'n', die beide neben den privaten Teilen des Schlüssels gespeichert werden.
Ryanc

16

OpenSSH kann keine PKCS # 12-Dateien sofort verwenden. Wie andere vorgeschlagen haben, müssen Sie den privaten Schlüssel im PEM-Format extrahieren, der Sie aus dem Land von OpenSSL nach OpenSSH bringt. Andere hier erwähnte Lösungen funktionieren bei mir nicht. Ich verwende OS X 10.9 Mavericks (derzeit 10.9.3) mit vorgefertigten Dienstprogrammen (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Extrahieren Sie zunächst einen privaten Schlüssel im PEM-Format, der direkt von OpenSSH verwendet wird:

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

Ich empfehle dringend, den privaten Schlüssel mit einem Passwort zu verschlüsseln:

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

Natürlich ist das Schreiben eines Klartextkennworts in der Befehlszeile auch nicht sicher. Sie sollten daher den letzten Befehl aus dem Verlauf löschen oder nur sicherstellen, dass er nicht dort ankommt. Unterschiedliche Muscheln haben unterschiedliche Möglichkeiten. Sie können Ihrem Befehl Leerzeichen voranstellen, um zu verhindern, dass er in Bash und vielen anderen Shells im Verlauf gespeichert wird. So löschen Sie den Befehl auch aus dem Verlauf in Bash:

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

Alternativ können Sie OpenSSL auf andere Weise ein Kennwort für einen privaten Schlüssel übergeben. Informationen zu Passphrasenargumenten finden Sie in der OpenSSL-Dokumentation .

Erstellen Sie dann einen öffentlichen OpenSSH-Schlüssel, der der Datei "authorized_keys" hinzugefügt werden kann:

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

Wofür ist das | openssl rsaZeug?
Snekse

1
@Snekse stellt sicher, dass die Ausgabe nur einen privaten Schlüssel enthält. In meinem Fall wird eine Identitätsdatei ( ~/.ssh/id_rsa) mit einigen "Cruft" wie "Bag Attributes" ohne "|" erstellt openssl rsa`. Ich denke, OpenSSH und andere Dienstprogramme, die Identitätsdateien verwenden, können mit dieser Cruft umgehen (ich habe es nicht versucht), aber ich werde einfach verwendet, um nur die erforderlichen Daten und nichts weiter bereitzustellen, insbesondere wenn es um Sicherheit geht.
Frzng

1
Diese Antwort funktionierte für mich, um Zugriff auf den privaten Schlüssel im PEM-Format im Terminal zu erhalten, den ich kopieren / einfügen konnte: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

Lösung 1:

Extrahieren Sie P12 aus jks

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

Extrahieren Sie PEM aus P12 und bearbeiten Sie die Datei und pem aus der CRT-Datei

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

Schlüssel aus jks extrahieren

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

Lösung 2:

Extrahieren Sie PEM und encryptedPrivateKey in die txt-Datei```

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

PrivateKey entschlüsseln

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

1
Bei der Beantwortung von Fragen ist es hilfreich, die Befehle hervorzuheben. Sie können dies tun, indem Sie vor und nach dem Befehl drei Backquotes hinzufügen, damit `` `echo hello``` wird echo hello.
PatS

2

Update: Ich habe festgestellt, dass meine Antwort nur ein schlechtes Duplikat einer gut erklärten Frage von BryKKan auf https: //unix.stackexchange.com / ... war

Hier ist ein Auszug daraus:

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
Das Hinzufügen einer Erklärung würde diese Antwort nützlicher machen.
mx0

0

Soweit ich weiß, ist PKCS # 12 nur ein Zertifikat- / öffentlicher / privater Schlüsselspeicher. Wenn Sie einen öffentlichen Schlüssel aus der PKCS # 12-Datei extrahiert haben, sollte OpenSSH ihn verwenden können, solange er im PEM- Format extrahiert wurde . Sie wissen wahrscheinlich bereits, dass Sie auch einen entsprechenden privaten Schlüssel (auch in PEM ) benötigen , um ihn für die Authentifizierung mit ssh-public-key zu verwenden.


0

Die akzeptierte Antwort ist der richtige Befehl. Ich möchte nur eine weitere Sache hinzufügen. Wenn Sie beim Extrahieren des Schlüssels das PEM-Passwort ( "Enter PEM pass phrase:") leer lassen, wird nicht der vollständige Schlüssel extrahiert, sondern nur derlocalKeyID . Um den vollständigen Schlüssel zu erhalten, müssen Sie ein PEM-Kennwort angeben, das den folgenden Befehl ausführt.

Bitte beachten Sie, dass Sie beim Importieren des Passworts das tatsächliche Passwort für angeben "Enter Import Password:"oder dieses Passwort leer lassen können:

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

1
Das sollte ein Kommentar zur akzeptierten Antwort sein, nicht die Antwort.
Styx
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.