Load key: "invalid format" oder "error in libcrypto"

SSH hat die Schlüsseldatei gelesen und konnte sie nicht als privaten Schlüssel auslesen. Bei Linux-Builds mit OpenSSL lautet dasselbe Problem meist error in libcrypto. Häufige Ursachen sind Windows-Zeilenenden, ein fehlender Zeilenumbruch am Ende, in einer CI-Variable verlorene Zeilenumbrüche, versehentlich verwendete .pub- oder .ppk-Dateien und eine abgeschnittene Kopie. Testen Sie die Datei mit ssh-keygen -y -f keyfile und korrigieren oder kopieren Sie sie dann erneut.

Keine Lust, Zeilenenden und Kopfzeilen zu jagen? Wardterm prüft einen Schlüssel, sobald Sie ihn hinzufügen. Zeigen

Aktualisiert am . Jede beschädigte Datei in der Tabelle wurde aus einem Wegwerf-Schlüssel erzeugt und mit OpenSSH 10.3 auf macOS (LibreSSL) und OpenSSH 10.0 auf Debian 13 (OpenSSL) getestet.

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 SieUrsacheLösung
grep -c gibt mehr als 0 ausWindows-Zeilenenden, von einem Windows-Editor oder einer Kopie über Windowstr -d '\r' < key > key.fixed
xxd zeigt 2d statt 0aKein Zeilenumbruch nach der END-Zeileecho >> key
Beginnt mit ssh-ed25519 AAAA oder ssh-rsa AAAADas ist der öffentliche SchlüsselDie Datei ohne .pub verwenden
Beginnt mit PuTTY-User-Key-FilePPK-FormatUmwandeln, siehe unten
Erste Zeile ist nicht -----BEGIN ... oder letzte Zeile nicht -----END ...Ein Teil der Datei fehltErneut aus der Quelle kopieren
Alles in einer Zeile, mit LeerzeichenZeilenumbrüche gingen verlorenSiehe CI unten
Leere DateiDas Kopieren ist fehlgeschlagenErneut aus der Quelle kopieren
file key meldet UTF-16Von PowerShell 5 mit > oder von einem auf Unicode eingestellten Editor gespeicherticonv -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.

Quellen

Mehr zu Fehlermeldungen

Alle Anleitungen