En plus de ssh et sshd, OpenSSH fournit ssh-keygen, qui génère et convertit des clés et, avec -Y sign, produit des signatures SSHSIG pour des fichiers et des commits git. Les faits présentés ici ont été vérifiés sur les paquets Alpine 3.24.2, OpenSSH 10.3p1, lié à l’OpenSSL 3.5.8 de l’image. Sans -t, ssh-keygen écrit une clé Ed25519. Les clés ECDSA n’existent que pour P-256, P-384 et P-521 (-b 224 est refusé), il n’y a pas d’Ed448, et DSA a disparu : ssh-keygen -t dsa répond « unknown key type dsa ». Inspectez n’importe quelle clé avec l’inspecteur de clés SSH.
Sans fichier de configuration, le client propose d’abord l’échange de clés hybride mlkem768x25519-sha256, puis sntrup761x25519-sha512, ce qui assure une protection post-quantique des clés de session. ssh -Q sig ne liste aucun algorithme de signature post-quantique : l’authentification de l’hôte et de l’utilisateur reste donc classique. RSA avec SHA-1 (ssh-rsa) est toujours implémenté, mais absent des listes par défaut des clés d’hôte et des clés publiques, si bien qu’avec les paramètres par défaut le client ne l’utilise jamais ; face à un pair qui ne propose rien de plus récent que ssh-rsa, il faut le réactiver explicitement, par exemple avec PubkeyAcceptedAlgorithms +ssh-rsa pour les clés utilisateur. Vérifiez ce qu’un serveur négocie avec l’audit de serveur SSH.
Une signature ECDSA dans SSH n’est ni du DER ni du r‖s brut : le blob est la chaîne ecdsa-sha2-nistp256 suivie d’une chaîne contenant r et s sous forme de mpint SSH (RFC 5656). Convertir des signatures depuis ou vers X.509, JWS ou WebAuthn implique donc de changer l’encodage des deux entiers. Les nonces sont aléatoires (deux signatures d’un même fichier différaient), s n’est pas normalisé, et une signature dont s avait été remplacé par n − s a passé la vérification.
Les signatures SSHSIG (ssh-keygen -Y sign) hachent le message avec SHA-512 par défaut ; -O hashalg=sha256 est la seule autre option, et SHA-1 et SHA-384 sont refusés. L’espace de noms indiqué avec -n fait partie de ce qui est signé, et vérifier une signature file en tant que email échoue avec « namespace does not match ». Les échecs se distinguent sur stderr (« invalid format » pour un blob endommagé, « incorrect signature » pour une signature valide portant sur d’autres données), tandis que stdout affiche « Could not verify signature. » dans les deux cas. Contrôlez une signature avec le vérificateur de signatures SSH.
ssh-keygen -e -m PKCS8 exporte une clé publique en SPKI PEM et -i -m PKCS8 la réimporte ; -m PEM donne aussi du SPKI pour ECDSA, mais du PKCS#1 pour RSA, et -m RFC4716 donne le format « SSH2 PUBLIC KEY ». Les clés publiques Ed25519 ne peuvent pas être exportées avec -e -m PKCS8 (« unsupported key type ED25519 »), alors que -p -m PKCS8 réécrit une clé privée Ed25519 en PKCS#8. Les clés privées sont stockées par défaut en OPENSSH PRIVATE KEY ; -p -m PEM réécrit les clés ECDSA en SEC1 et les clés RSA en PKCS#1, et -m PKCS8 avec une phrase de passe écrit du PKCS#8 chiffré.