Was Sie sehen
Load key "/home/user/.ssh/id_ed25519": invalid format
user@server: Permission denied (publickey).
Auf vielen Linux-Systemen liefert dieselbe beschädigte Datei:
Load key "/home/user/.ssh/id_ed25519": error in libcrypto
In unseren Tests lieferte dieselbe Datei auf macOS invalid format und auf Debian error in libcrypto. Behandeln Sie beides also als ein Problem. Eine falsche Passphrase sieht anders aus: incorrect passphrase supplied to decrypt private key.
SSH bricht hier nicht ab. Es macht mit anderen Schlüsseln und Passwörtern weiter, die Anmeldung kann also später scheitern oder sogar mit etwas anderem gelingen.
Die Datei testen, ohne sich zu verbinden
ssh-keygen -y -f ~/.ssh/id_ed25519
Ein guter Schlüssel gibt seinen öffentlichen Schlüssel aus, oder fragt nach einer Passphrase und gibt ihn dann aus. Ein schlechter gibt denselben Load key-Fehler aus. file ist hier kein verlässlicher Test: Es meldet für eine beschädigte Datei weiterhin OpenSSH private key.
Prüfen, was an der Datei falsch ist
Bei einer intakten Datei geben diese Befehle nur die Kopf- und Fußzeile aus. Eine beschädigte Datei mit allem in einer Zeile würde den ganzen Schlüssel zeigen, führen Sie sie also nicht in einem CI-Log oder auf einem geteilten Bildschirm aus:
head -1 ~/.ssh/id_ed25519
tail -1 ~/.ssh/id_ed25519
tail -c 1 ~/.ssh/id_ed25519 | xxd
grep -c $'\r' ~/.ssh/id_ed25519
| Das sehen Sie | Ursache | Lösung |
|---|---|---|
grep -c gibt mehr als 0 aus | Windows-Zeilenenden, von einem Windows-Editor oder einer Kopie über Windows | tr -d '\r' < key > key.fixed |
xxd zeigt 2d statt 0a | Kein Zeilenumbruch nach der END-Zeile | echo >> key |
Beginnt mit ssh-ed25519 AAAA oder ssh-rsa AAAA | Das ist der öffentliche Schlüssel | Die Datei ohne .pub verwenden |
Beginnt mit PuTTY-User-Key-File | PPK-Format | Umwandeln, siehe unten |
Erste Zeile ist nicht -----BEGIN ... oder letzte Zeile nicht -----END ... | Ein Teil der Datei fehlt | Erneut aus der Quelle kopieren |
| Alles in einer Zeile, mit Leerzeichen | Zeilenumbrüche gingen verloren | Siehe CI unten |
| Leere Datei | Das Kopieren ist fehlgeschlagen | Erneut aus der Quelle kopieren |
file key meldet UTF-16 | Von PowerShell 5 mit > oder von einem auf Unicode eingestellten Editor gespeichert | iconv -f UTF-16 -t UTF-8 key > key.fixed |
Die strengen Prüfungen von Zeilenenden und abschließendem Zeilenumbruch gelten für das neuere Format, das mit -----BEGIN OPENSSH PRIVATE KEY----- beginnt. Eine ältere Datei mit -----BEGIN RSA PRIVATE KEY----- und demselben Schaden ließ sich in unserem Test weiterhin laden.
Setzen Sie nach dem Schreiben einer korrigierten Kopie die Berechtigungen und testen Sie sie. Ohne das kann SSH sie aus einem anderen Grund ablehnen, siehe Unprotected private key file:
chmod 600 key.fixed
ssh-keygen -y -f key.fixed
Schlüssel in CI-Variablen
Das ist eine sehr häufige Quelle des Fehlers. Ohne Anführungszeichen macht die Shell aus den Zeilenumbrüchen Leerzeichen. Und printf '%s' fügt keinen Zeilenumbruch an, eine Variable ohne abschließenden Zeilenumbruch ergibt also eine fehlerhafte Datei. Beides ist fehlgeschlagen:
echo $SSH_KEY > key
printf '%s' "$SSH_KEY" > key
Das hier funktioniert, solange die Variable den vollständigen Schlüssel mit seinen Zeilenumbrüchen enthält:
printf '%s\n' "$SSH_KEY" > key
chmod 600 key
ssh-keygen -y -f key > /dev/null
Führen Sie die letzte Zeile als frühen Schritt im Job aus, dann scheitert er mit einer klaren Fehlermeldung. Beachten Sie, was Ihr CI-System mit mehrzeiligen Werten macht. Manche behalten sie nur, wenn sie als Datei gespeichert sind, andere speichern stattdessen Base64.
PPK-Schlüssel
OpenSSH liest keine .ppk-Dateien. Wandeln Sie sie mit dem PPK-Schlüsselgenerator um, oder unter Linux und macOS so:
puttygen key.ppk -O private-openssh -o key
chmod 600 key
Einzelheiten unter PPK-Schlüssel in OpenSSH umwandeln.
Falsche Datei in Ihrer Konfiguration
Wenn Sie diesen Schlüssel gar nicht verwenden wollten, sehen Sie nach, woher er kommt:
ssh -G server | grep '^identityfile '
-i key.pub und IdentityFile key.pub sind ein häufiger Fehler. SSH bietet den öffentlichen Schlüssel an, der Server akzeptiert ihn, und dann scheitert das Laden als privater Schlüssel, oft mit bad permissions, weil .pub-Dateien für alle lesbar sind. Verweisen Sie auf die private Datei.
Ist der Schlüssel wirklich abgeschnitten und haben Sie keine andere Kopie, lässt er sich nicht reparieren. Erzeugen Sie einen neuen Schlüssel, installieren Sie ihn und entfernen Sie den alten öffentlichen Schlüssel von Ihren Servern.
Den öffentlichen Schlüssel aus einem funktionierenden privaten Schlüssel gewinnen: öffentlichen Schlüssel aus dem privaten erzeugen.
Fragen
Was ist der Unterschied zwischen invalid format und error in libcrypto?
Meist keiner. Dieselbe beschädigte Datei ergibt invalid format bei LibreSSL-Builds, etwa unter macOS, und error in libcrypto bei OpenSSL-Builds unter Linux.
Lässt sich ein Schlüssel mit invalid format reparieren?
Oft ja, wenn nur Zeilenenden oder der abschließende Zeilenumbruch falsch sind. Ein abgeschnittener Schlüssel lässt sich nicht reparieren: Erzeugen Sie einen neuen und ersetzen Sie den öffentlichen Schlüssel auf Ihren Servern.
Warum funktioniert mein Schlüssel lokal, aber nicht in CI?
Meist hat die CI-Variable ihre Zeilenumbrüche oder den letzten Zeilenumbruch verloren. Schreiben Sie sie in Anführungszeichen und mit abschließendem Zeilenumbruch in die Datei und testen Sie sie mit ssh-keygen -y -f.