Comment utiliser une YubiKey ou une clé FIDO2 avec SSH (ed25519-sk)

La clé matérielle étant branchée, exécutez ssh-keygen -t ed25519-sk -O verify-required et installez le fichier .pub obtenu sur le serveur comme d'habitude. La clé privée reste sur l'appareil, et chaque connexion demande un toucher et un code PIN. Le client et le serveur doivent avoir OpenSSH 8.2 ou plus, ou 8.4 pour verify-required. Les clés plus anciennes sans prise en charge d'Ed25519 demandent -t ecdsa-sk.

Mis à jour le . L'erreur macOS vient du ssh-keygen inclus dans macOS 27 (OpenSSH 10.3), et device not found d'OpenSSH 10.0 sous Debian 13 sans clé branchée.

Ce qu'il vous faut

  • OpenSSH 8.2 ou plus des deux côtés. Cette version a ajouté les types de clé ed25519-sk et ecdsa-sk. Vérifiez le client et le serveur avec ssh -V. verify-required demande la 8.4.
  • Une clé qui prend en charge Ed25519. C'est facultatif dans la norme FIDO. Yubico indique que les YubiKey demandent un firmware 5.2.3 ou plus récent. Sur les plus anciennes, utilisez -t ecdsa-sk.
  • Une version d'OpenSSH compilée avec la prise en charge de FIDO. Voir la section suivante si vous utilisez un Mac.

Pour savoir si un serveur acceptera ces clés, exécutez ceci sur le serveur et cherchez sk-ssh-ed25519@openssh.com :

sudo sshd -T | grep -i pubkeyacceptedalgorithms

Sur macOS, le ssh intégré ne suffit pas

Le ssh-keygen fourni avec macOS nous a donné ceci :

No FIDO SecurityKeyProvider specified
Key enrollment failed: invalid format

La version d'OpenSSH de Homebrew dépend de libfido2, qui fournit cette prise en charge. Installez-la et vérifiez que votre shell trouve cette version en premier :

brew install openssh
which ssh-keygen

Créer la clé

ssh-keygen -t ed25519-sk -O verify-required -C "you@laptop"

Touchez la clé quand elle clignote, et saisissez son PIN si on vous le demande. Vous obtenez deux fichiers :

  • ~/.ssh/id_ed25519_sk : le handle. Il ressemble à une clé privée mais ne contient qu'une référence. Il est inutile sans la clé matérielle.
  • ~/.ssh/id_ed25519_sk.pub : la clé publique.

Si aucune clé n'est branchée, ou si le système ne la voit pas, vous obtenez :

Key enrollment failed: device not found

L'installer et se connecter

ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server
ssh -i ~/.ssh/id_ed25519_sk user@server

La ligne dans authorized_keys fonctionne comme n'importe quelle autre, mais son type est sk-ssh-ed25519@openssh.com.

Les options qui comptent

OptionCe qu'elle fait
-O verify-requiredChaque signature exige une vérification de l'utilisateur, en général le PIN, en plus d'un toucher. Un jeton volé ne suffit alors pas.
-O residentStocke le handle sur le jeton, pour pouvoir l'utiliser depuis un autre ordinateur sans copier de fichier.
-O application=ssh:workDéfinit un nom pour la clé. Il doit commencer par ssh:. Utile pour garder plusieurs clés résidentes sur un même jeton.
-O no-touch-requiredSignature sans toucher. Le serveur doit aussi l'autoriser : laissez-la désactivée sauf raison précise.

Résidente ou non

Non résidente (par défaut)Résidente
Où se trouve le handleDans un fichier sur votre ordinateurSur le jeton
Usage sur un nouvel ordinateurCopier le fichier handleLe télécharger depuis le jeton
Un voleur a besoinDu jeton et du fichierDu jeton, et du PIN si vous en avez défini un

Une clé résidente est pratique, mais quiconque tient le jeton peut récupérer le handle : associez-la donc à un PIN :

ssh-keygen -t ed25519-sk -O resident -O verify-required -C "you@laptop"

Sur un autre ordinateur, récupérez les fichiers ou chargez la clé directement dans l'agent :

ssh-keygen -K
ssh-add -K

ssh-keygen -K écrit les fichiers dans le dossier courant.

Exiger un PIN côté serveur

Une clé créée sans verify-required peut quand même y être soumise par le serveur. Ajoutez l'option au début de sa ligne dans authorized_keys :

verify-required sk-ssh-ed25519@openssh.com AAAA... you@laptop

Prévoir la perte du jeton

Si le jeton disparaît, la clé disparaît. Enregistrez deux jetons, installez les deux clés publiques sur chaque serveur et gardez le second en lieu sûr. Gardez aussi une autre voie d'accès, comme une console de votre hébergeur, avant de désactiver les autres connexions.

Gardez les fichiers handle, et la liste des serveurs que chaque token ouvre, au même endroit, par exemple dans un gestionnaire de clés SSH avec coffre chiffré.

Questions

La clé privée peut-elle être copiée hors de la YubiKey ?

Non. D'après les notes de version d'OpenSSH, la partie privée de la clé est propre à chaque jeton et ne peut pas être exportée. C'est aussi pourquoi il faut enregistrer un second jeton comme secours.

Ai-je encore besoin d'une phrase secrète ?

Elle est facultative. Le fichier handle ne suffit pas sans le jeton, et un PIN avec verify-required couvre le cas d'un jeton volé. Une phrase secrète sur le fichier handle ajoute une étape si vous la souhaitez.

Puis-je utiliser la même YubiKey sur plusieurs ordinateurs ?

Oui. Avec une clé résidente, lancez ssh-keygen -K sur le nouvel ordinateur pour récupérer les fichiers depuis le jeton. Avec une clé non résidente, copiez le fichier handle id_ed25519_sk sur le nouvel ordinateur. Dans les deux cas, chaque connexion demande toujours le jeton.

Sources

Autres guides : Clés et connexion

Tous les guides