Neben ssh und sshd bringt OpenSSH ssh-keygen mit, das Schlüssel erzeugt und konvertiert und mit -Y sign SSHSIG-Signaturen für Dateien und Git-Commits erstellt. Die Fakten auf dieser Seite wurden mit den Paketen aus Alpine 3.24.2 geprüft, OpenSSH 10.3p1, gelinkt gegen das OpenSSL 3.5.8 des Images. Ohne -t schreibt ssh-keygen einen Ed25519-Schlüssel. ECDSA-Schlüssel gibt es nur für P-256, P-384 und P-521 (-b 224 wird abgelehnt), Ed448 fehlt, und DSA ist entfernt: ssh-keygen -t dsa antwortet mit „unknown key type dsa“. Untersuche jeden Schlüssel mit dem SSH-Schlüsselinspektor.
Ohne Konfigurationsdatei bietet der Client zuerst den hybriden Schlüsselaustausch mlkem768x25519-sha256 an, danach sntrup761x25519-sha512 – Post-Quanten-Schutz für die Sitzungsschlüssel. ssh -Q sig listet keinen Post-Quanten-Signaturalgorithmus auf, Host- und Benutzerauthentifizierung bleiben also klassisch. RSA mit SHA-1 (ssh-rsa) ist weiterhin implementiert, fehlt aber in den Standardlisten für Host-Schlüssel und öffentliche Schlüssel, sodass der Client es mit den Standardeinstellungen nie verwendet; für eine Gegenstelle, die nichts Neueres als ssh-rsa anbietet, muss es ausdrücklich wieder aktiviert werden, für Benutzerschlüssel etwa mit PubkeyAcceptedAlgorithms +ssh-rsa. Was ein Server aushandelt, zeigt das SSH-Server-Audit.
Eine ECDSA-Signatur in SSH ist weder DER noch rohes r‖s: Der Blob besteht aus dem String ecdsa-sha2-nistp256, gefolgt von einem String, der r und s als SSH-mpints enthält (RFC 5656). Um Signaturen von oder nach X.509, JWS oder WebAuthn zu konvertieren, musst du deshalb die beiden Ganzzahlen neu kodieren. Nonces sind zufällig – zwei Signaturen derselben Datei unterschieden sich –, s wird nicht normalisiert, und eine Signatur, in der s durch n − s ersetzt war, bestand die Prüfung.
SSHSIG-Signaturen (ssh-keygen -Y sign) hashen die Nachricht standardmäßig mit SHA-512; -O hashalg=sha256 ist die einzige Alternative, SHA-1 und SHA-384 werden abgelehnt. Der mit -n angegebene Namespace ist Teil der signierten Daten, und die Prüfung einer Signatur für den Namespace file als email scheitert mit „namespace does not match“. Fehlschläge lassen sich auf stderr unterscheiden – „invalid format“ für einen beschädigten Blob, „incorrect signature“ für eine gültige Signatur über andere Daten –, während stdout in beiden Fällen „Could not verify signature.“ ausgibt. Prüfe eine Signatur mit dem SSH-Signatur-Verifizierer.
ssh-keygen -e -m PKCS8 exportiert einen öffentlichen Schlüssel als SPKI-PEM, und -i -m PKCS8 importiert ihn wieder; -m PEM liefert für ECDSA ebenfalls SPKI, für RSA aber PKCS#1, und -m RFC4716 liefert das Format „SSH2 PUBLIC KEY“. Öffentliche Ed25519-Schlüssel lassen sich mit -e -m PKCS8 nicht exportieren („unsupported key type ED25519“), obwohl -p -m PKCS8 einen privaten Ed25519-Schlüssel als PKCS#8 neu schreibt. Private Schlüssel werden standardmäßig als OPENSSH PRIVATE KEY gespeichert; -p -m PEM schreibt ECDSA-Schlüssel als SEC1 und RSA-Schlüssel als PKCS#1 neu, und -m PKCS8 mit Passphrase schreibt verschlüsseltes PKCS#8.