key_load_public: ungültiges Format

98

Ich habe PuTTY Key Generator verwendet, um einen 4096-Bit-RSA-2-Schlüssel mit einer Passphrase zu generieren.

Ich speichere die PPK-Datei und einen öffentlichen Schlüssel im OpenSSL-Format. Der öffentliche Schlüssel im Kittformat funktioniert nicht.

In jedem Fall lautet mein Fehler wie folgt:

$ ssh -T [email protected]
key_load_public: invalid format
Enter passphrase for key '/c/Users/Dan/.ssh/id_rsa':
Hi Dan! You've successfully authenticated, but GitHub does not provide shell access.

Was ist das Problem?

Ich benutze Pageant, um die Schlüssel zu laden, und ich benutze Git Bash, um die SSH-Verbindung zu versuchen. Ich habe den Schlüssel auch in GitHub geladen und bin mir nicht sicher, was ich falsch mache.

Ich habe versucht, eine neue Zeile hinzuzufügen und keine neue Zeile in GitHub hinzuzufügen

JordanGS
quelle
Warum denkst du, funktioniert es nicht? Es heißt erfolgreich authentifiziert .
Roland Smith
2
@ RolandSmith Es sagt mir key_load_public: invalid formatrichtig, wie ich den Befehl ausführe, bevor ich die Passphrase eingebe?
JordanGS
1
Führen Sie Folgendes aus: 'ssh -vvv -T [email protected]', um weitere Informationen zu erhalten. Wahrscheinlich ist ~ / .ssh / unknown_hosts schlecht - ssh sucht nach dem öffentlichen Schlüssel von github. Sie können 'Dateischlüssel' ausführen, um das Format der Schlüsseldatei herauszufinden.
Mosh

Antworten:

181

Wie Roland in seiner Antwort erwähnt hat, ist es eine Warnung, dass das ssh-agentFormat des öffentlichen Schlüssels nicht verstanden wird und der öffentliche Schlüssel selbst dann nicht lokal verwendet wird.

Ich kann jedoch auch erläutern und beantworten, warum die Warnung vorhanden ist. Es läuft einfach darauf hinaus, dass der PuTTY-Schlüsselgenerator zwei verschiedene öffentliche Schlüsselformate generiert , je nachdem, was Sie im Programm tun.

Hinweis: Während meiner Erläuterung werden die Schlüsseldateien, die ich verwenden / generieren werde, id_rsamit den entsprechenden Erweiterungen benannt. Zum besseren Kopieren und Einfügen wird außerdem der übergeordnete Ordner der Schlüssel angenommen ~/.ssh/. Passen Sie diese Details an Ihre Bedürfnisse an.

Die Formate

Link zur entsprechenden PuTTY-Dokumentation

SSH-2

Wenn Sie speichern eine Taste mit dem PuTTY Key Generator „Speichern öffentlicher Schlüssel“ Taste, wird es in der durch definierte Format gespeichert werden RFC 4716 .

Beispiel:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "github-example-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYF
i2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcp
pY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3
oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEA
ip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9
tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw==
---- END SSH2 PUBLIC KEY ----

OpenSSH

Entgegen der landläufigen Meinung wird dieses Format vom Generator nicht gespeichert. Es wird jedoch generiert und im Textfeld "Öffentlicher Schlüssel zum Einfügen in die OpenSSH-Datei" authorized_keys "angezeigt. Um es als Datei zu speichern, müssen Sie es manuell aus dem Textfeld kopieren und in eine neue Textdatei einfügen.

Für den oben gezeigten Schlüssel wäre dies:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key

Das Format des Schlüssels ist einfach ssh-rsa <signature> <comment>und kann durch Neuanordnen der SSH-2-formatierten Datei erstellt werden.

Öffentliche Schlüssel regenerieren

Wenn Sie davon Gebrauch machen ssh-agent, haben Sie wahrscheinlich auch Zugriff auf ssh-keygen.

Wenn Sie über Ihren privaten OpenSSH-Schlüssel ( id_rsaDatei) verfügen , können Sie die öffentliche OpenSSH-Schlüsseldatei mithilfe von Folgendem generieren:

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

Wenn Sie nur den privaten PUTTY-Schlüssel ( id_rsa.ppkDatei) haben, müssen Sie ihn zuerst konvertieren.

  1. Öffnen Sie den PuTTY Key Generator
  2. Klicken Sie in der Menüleiste auf "Datei"> "Privaten Schlüssel laden".
  3. Wählen Sie Ihre id_rsa.ppkDatei aus
  4. Klicken Sie in der Menüleiste auf "Conversions"> "OpenSSH-Schlüssel exportieren".
  5. Speichern Sie die Datei als id_rsa(ohne Erweiterung)

Nachdem Sie über einen privaten OpenSSH-Schlüssel verfügen, können Sie das ssh-keygenTool wie oben beschrieben verwenden, um den Schlüssel zu bearbeiten.

Bonus: Das PKCS # 1 PEM-codierte Public Key Format

Um ehrlich zu sein, weiß ich nicht, wofür dieser Schlüssel verwendet wird, da ich ihn nicht gebraucht habe. Aber ich habe es in meinen Notizen, die ich im Laufe der Jahre zusammengestellt habe, und ich werde es hier für eine gesunde Güte aufnehmen. Die Datei sieht folgendermaßen aus:

-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----

Diese Datei kann mit einem privaten OpenSSH-Schlüssel (wie oben unter "Regenerieren öffentlicher Schlüssel" generiert) generiert werden, indem:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem

Alternativ können Sie einen öffentlichen OpenSSH-Schlüssel verwenden, indem Sie:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem

Verweise:

samthecodingman
quelle
Wenn Sie Ihren privaten Schlüssel in einen OpenSSH-Schlüssel konvertieren, wird meiner Meinung nach empfohlen, die Dateierweiterung nicht zu verwenden und nicht vorzuziehen. Mein Git-Client stellt keine Verbindung zum Remote-Repository her, wenn eine Erweiterung für den privaten Schlüssel verwendet wird.
Programmer1994
@ Programmer1994 Die Konvertierungsanweisungen wurden als Schritte zum Konvertieren .ppkin eine .pubDatei enthalten. Der Nebeneffekt, dass der zwischengeschaltete id_rsaprivate Schlüssel tatsächlich von einem anderen Programm verwendet wird, wurde übersehen. Ich habe die Sprache "vorzugsweise ohne Erweiterung" in "(ohne Erweiterung)" geändert, um Unklarheiten zu beseitigen. Ich nutzte auch die Gelegenheit, um einige Missstände neu zu formulieren, die auftauchen, wenn ich auf diese Antwort zurückblicke. Danke für Ihren Beitrag.
Samthecodingman
Danke für die Antwort. Ich habe den Befehl im Abschnitt Ihrer Antwort "Öffentliche Schlüssel neu generieren" verwendet und er hat mein Problem gelöst.
Desmond13
Sie haben über öffentliche Schlüssel gesprochen. Das Problem wird jedoch aus einem privaten Schlüssel id_rsa generiert. Ich erhalte die gleiche Warnung, wenn ich meinen privaten SSH-Schlüssel verwende, wenn ich versuche, über SSH auf einen Git-Server zuzugreifen.
Ahnbizcad
5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubdas löste es. DANKE!
Dwza
15

Es gibt eine einfache Lösung, wenn Sie das Puttygen-Tool installieren und verwenden können. Unten sind die Schritte. Sie sollten die Passphrase des privaten Schlüssels haben.

Schritt 1: Laden Sie den neuesten Kitt herunter und öffnen Sie den Kitt

Schritt 2: Laden Sie Ihre vorhandene private Schlüsseldatei (siehe Abbildung unten)

Laden Sie einen vorhandenen privaten Schlüssel

Schritt 3: Geben Sie die Passphrase für den Schlüssel ein, wenn Sie dazu aufgefordert werden, und klicken Sie auf OK

Geben Sie die Paasphrase ein

Schritt 4: Wie im folgenden Bild gezeigt, wählen Sie die Menüregisterkarte "Konvertierung" und dann "OpenSSH-Schlüssel exportieren".

OpenSSH-Datei speichern

Speichern Sie die neue private Schlüsseldatei am bevorzugten Speicherort und verwenden Sie sie entsprechend.

PradeepNama
quelle
1
Ich habe die load pubkey invalid formatWarnung erhalten, als ich den Schlüssel mit dem Export OpenSSH-Schlüssel exportiert habe . Bei Verwendung des OpenSSH-Schlüssels exportieren (neues Dateiformat erzwingen) ging es verloren .
Elsamuko
7

Wenn Sie Ihren öffentlichen Schlüssel mit der Zwischenablage kopieren und einfügen, kann es vorkommen, dass die Zeichenfolge für den öffentlichen Schlüssel unterbrochen wird, die eine neue Zeile enthält.

Stellen Sie sicher, dass Ihre öffentliche Schlüsselzeichenfolge aus einer Zeile besteht.

Hojin Choi
quelle
6

TL; DR:id_rsa.pub Stellen Sie außerdem sicher, dass Sie sich in ASCII / UTF-8 befinden.

Ich hatte das gleiche Problem, aber die akzeptierte Antwort allein funktionierte aufgrund der Textcodierung nicht, was ein zusätzliches, leicht zu übersehendes Problem war.

Wenn ich renne

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

In Windows PowerShell wird die Ausgabe id_rsa.pubin UTF-16 LE BOM- Codierung gespeichert , nicht in UTF-8 . Dies ist eine Eigenschaft einiger Installationen von PowerShell, die unter Verwenden von PowerShell zum Schreiben einer Datei in UTF-8 ohne Stückliste erläutert wurden . Anscheinend erkennt OpenSSH die frühere Textcodierung nicht und erzeugt einen identischen Fehler:

key_load_public: invalid format

Das Kopieren und Einfügen der Ausgabe ssh-keygen -f ~/.ssh/id_rsa -yin einen Texteditor ist der einfachste Weg, dies zu lösen.

PS Dies könnte eine Ergänzung zu der akzeptierten Antwort sein , aber ich habe noch nicht genug Karma, um hier einen Kommentar abzugeben.

Paperskilltrees
quelle
1
Wie Sie festgestellt haben, funktionieren Rohrleitungen in Powershell anders. Sie würden ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pubstattdessen verwenden.
Samthecodingman
5

Es scheint, dass sshIhr öffentlicher Schlüssel nicht gelesen werden kann. Aber das spielt keine Rolle.

Sie laden Ihren öffentlichen Schlüssel auf github hoch, authentifizieren sich jedoch mit Ihrem privaten Schlüssel . Siehe zB den Abschnitt DATEIEN in ssh(1).

Roland Smith
quelle
2
Kurz gesagt, gehen Sie zu putty key gen, klicken Sie auf Konvertierungen -> öffnen Sie den ssh-Schlüssel und speichern Sie ihn in id_rsa. Stellen Sie sicher, dass Ihre HOME env-Variable auf den angezeigten .ssh-Ordner zeigt, und löschen Sie alle anderen Kopien der id_rsa-Datei von Ihrem System
Kalpesh Soni
2

Anstatt den privaten Schlüssel direkt zu speichern, gehen Sie zu Konvertierungen und exportieren Sie den SSh-Schlüssel. Hatte das gleiche Problem und das hat bei mir funktioniert

Jignesh Rawal
quelle
1

Ich hatte die gleiche Warnung. Es war ein sehr alter Schlüssel. Ich habe einen Schlüssel auf dem aktuellen OpenSSH 7 neu generiert und der Fehler war verschwunden.

Arberg
quelle
1

Der Fehler ist irreführend - er sagt " pubkey", während er auf eine private Schlüsseldatei zeigt ~/.ssh/id_rsa.

In meinem Fall war es einfach ein fehlender öffentlicher Schlüssel (da ich ihn nicht aus einem Tresor wiederhergestellt habe).


EINZELHEITEN

Früher habe ich die Bereitstellung ~/.ssh/id_rsa.pubdurch automatisierte Skripte übersprungen.

Alle sshVerwendungen funktionierten, aber der Fehler ließ mich an ein mögliches Durcheinander denken.

Überhaupt nicht - stracehalf zu bemerken, dass der Auslöser tatsächlich die *.pubDatei war:

strace ssh example.com
...
openat(AT_FDCWD, "/home/uvsmtid/.ssh/id_rsa.pub", O_RDONLY) = -1 ENOENT (No such file or directory)
...
write(2, "load pubkey \"/home/uvsmtid/.ssh/"..., 57) = 57
load pubkey "/home/uvsmtid/.ssh/id_rsa": invalid format
uvsmtid
quelle
0

Nach dem Update hatte ich das gleiche Problem. Ich habe PEM key_fileohne Erweiterung verwendet und einfach .pemmein Problem behoben. Jetzt ist die Datei key_file.pem.

Furang
quelle
0

Wenn Sie Windows 10 mit dem integrierten SSH verwenden, werden ab August 2020 nur noch ed25519-Schlüssel unterstützt. Sie erhalten den key_load_public: invalid formatFehler, wenn Sie zB einen RSA-Schlüssel verwenden.

Laut diesem GitHub-Problem sollte es irgendwann im Jahr 2020 über Windows Update behoben werden. Eine Lösung besteht also darin, nur auf den Versand des Updates zu warten.

Wenn Sie nicht warten können, besteht eine Problemumgehung darin, einen neuen ed25519-Schlüssel zu generieren, was ohnehin ein guter Rat ist .

> ssh-keygen -o -a 100 -t ed25519

Sie können es zB mit Github verwenden, aber einige ältere Systeme unterstützen dieses neuere Format möglicherweise nicht.

Wenn Sie nach dem Generieren Ihres Schlüssels eine der folgenden Funktionen verwenden, vergessen Sie nicht, diese zu aktualisieren!

  1. ~\.ssh\config könnte immer noch auf den alten Schlüssel zeigen.
  2. Fügen Sie den neuen Schlüssel über den ssh-addBefehl zu ssh-agent hinzu
Wille
quelle