Wie konvertiere ich einen öffentlichen ssh-keygen-Schlüssel in ein Format, das die Funktion openssl PEM_read_bio_RSA_PUBKEY () benötigt?

49

Ich habe ein Problem beim Generieren eines öffentlichen Schlüssels, den die openssl- PEM_read_bio_RSA_PUBKEY()Funktion verwenden kann. Ich bekomme immer wieder Fehler.

Offensichtlich kann ich die ASCII-Zeichenfolge in der ssh-keygen <>.pubSchlüsseldatei nicht einfach verwenden, da sie im SSH-Dateiformat vorliegt oder ich sie möglicherweise SubjectPublicKeyInfostrukturiere.

Hier ist der Schlüsselcode: ssh-keygen -t rsa -b 1024 -C "Test Key"

Ich habe einen Konverter in PHP im Web gefunden, der den Inhalt des öffentlichen Schlüssels in ein Base64-PEM-ASCII-Zeichenfolgenformat konvertiert. Allerdings gefällt es der Funktion immer noch nicht.

In der Openssl-Dokumentation heißt es:

  1. "RSA_PUBKEY () - Funktion, die einen öffentlichen Schlüssel unter Verwendung einer EVP_PKEY-Struktur verarbeitet"
  2. „RSA_PUBKEY-Funktionen verarbeiten auch einen öffentlichen RSA-Schlüssel mithilfe einer RSA-Struktur“

Wie kann ich meinen öffentlichen OpenSSH-Schlüssel in ein Format bringen, das von der OpenSSL-Funktion verwendet wird?

PeteP
quelle
Herausgefunden: Verwenden Sie das openssl-Tool nur als solches:
PeteP
Privaten Schlüssel erstellen: openssl genrsa -out test.priv.key 2048; Geben Sie den öffentlichen Schlüssel im gleichen Format (PEM?) Aus: openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Cross-related security.stackexchange.com/questions/32768/…
dave_thompson_085

Antworten:

56

OKAY!

Also ging ich zu dem Gedanken über: "Einfach, ich habe das verstanden." Es hat sich herausgestellt, dass viel mehr dahinter steckt, als ich dachte.

Das erste Problem ist, dass OpenSSL (gemäß den Manpages für OpenSSL (man 3 pem)) erwartet, dass der RSA-Schlüssel im PKCS # 1-Format vorliegt. Offensichtlich arbeitet ssh-keygen nicht damit. Sie haben zwei Möglichkeiten (von der Suche um).

Wenn Sie OpenSSH v. 5.6 oder neuer haben (ich habe es nicht auf meinem Laptop getan), können Sie dies ausführen:

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

Die längere Methode besteht darin, Ihren SSH-Schlüssel in verschiedene Komponenten aufzuteilen (der Blogeintrag, den ich in OpenSSH als "proprietär" bezeichnete, ich nenne ihn lieber "einzigartig") und dann eine ASN1-Bibliothek zu verwenden Dinge tauschen.

Zum Glück hat jemand den Code dazu geschrieben:

https://gist.github.com/1024558

Brian Redbeard
quelle
9
Die ssh-keygenMethode scheint zu funktionieren auf Linux , aber nicht Mac OS X
Deckel
3
Deckel, siehe den Hinweis in der Antwort zur SSH-Version. OS X liefert keine aktuelle Version von OpenSSH aus. Führen Sie den Befehl aus ssh -V.
Brian Redbeard
3
Funktioniert nicht in OpenSSH_6.2p2. Funktioniert in OpenSSH_6.6p1.
Old Pro
-mfunktioniert bei mir nicht ... wie sieht die arbeit aus?
Pstanton
2
Funktioniert bei mir auf dem Mac!
Greg Hornby
18

Angenommen, Sie haben den privaten SSH-Schlüssel id_rsa, dann können Sie den öffentlichen Schlüssel folgendermaßen daraus extrahieren:

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

Mir ist klar, dass das OP nach der Konvertierung eines öffentlichen Schlüssels gefragt hat, daher ist die Frage hier nicht ganz beantwortet, aber ich dachte, es wäre für einige trotzdem nützlich.

Beachten Sie auch, dass dieser Befehl zu einem PEM-Public-Key-Format führt, das OpenSSL im Allgemeinen erwartet. Die Antwort von Brian führt andererseits zu einer Datei im RSAPublicKey-Format, das nicht das von OpenSSL erwartete normale Format ist (obwohl spätere Versionen es anscheinend über das -RSAPublicKey_inFlag lesen können ). So konvertieren Sie:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
quelle
Danke, der -Pubout vom privaten Schlüssel hat den Trick für mich getan.
Shaun Dewberry
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemfunktioniert auch (dh die Eingabe ist ein privater Schlüssel im PEM-Format). Gute Antwort.
Johnny Wong
1
Update: Brians Antwort wurde korrigiert worden , -m pkcs8die trotz OpenSSH Leute den falschen Namen verwenden tut produzieren X.509 ‚pubkey‘. Seit OpenSSH 6.5 im Jahr 2014-01 funktioniert -odiese Methode nicht mehr, wenn der Ersteller "neues Format" für eine bessere Sicherheit angegeben hat. Seit 7.8 im Jahr 2018-08 ist "neues Format" nun ebenfalls die Standardeinstellung.
Dave_Thompson_085
11

Das Format, das Sie wollen, ssh-keygennennt man PKCS8. Der folgende Befehl erzeugt also die gewünschte Ausgabe:

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

Von der ssh-keygenManpage:

-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''.
Aaron Meriwether
quelle
Dieser funktioniert sowohl unter Linux als auch unter MacOS.
Jay Taylor
das Äquivalent erzeugten öffentlichen Schlüssel aus privaten Schlüssel zu extrahieren in OpenSSL OpenSSL rsa -in Schlüssel -pubout -out key.pub.openssl.pkcs8
Mohannd
6

Ähnlich wie die Methode von Amal Chaudhuri unten hat dies bei mir funktioniert. Ich musste eine PEM-Datei aus dem öffentlichen SSH-Schlüssel erstellen, den ich für meinen SFTP-Client (Cyberduck) generiert hatte.

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
l3e0wu1f
quelle
das scheint eigentlich nicht zu funktionieren.
Außerhalb2344
5
Dies funktioniert NUR für den privaten RSA-Schlüssel, NICHT für den öffentlichen Schlüssel, nach dem OP gefragt hat. Also falsche Antwort.
Devy
3
Tatsächlich liegt id_rsabereits das richtige Format vor, Sie können es selbst überprüfen, das Ergebnis id_rsa.pemist zu 100% identisch.
Miro Kropacek
-2

Eine andere Möglichkeit, dies von einer anderen Site aus zu tun. Posting dies für den Fall, dass Sie eine andere Methode benötigen. Funktioniert sehr gut http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem
Amal Chaudhuri
quelle
Diese Methode scheint nicht wirklich zu funktionieren.
Sean
7
id_rsaist kein öffentlicher Schlüssel. Falsche Antwort.
Ahmet Alp Balkan