{"id":150,"date":"2026-06-14T16:32:27","date_gmt":"2026-06-14T16:32:27","guid":{"rendered":"https:\/\/shattered.io\/fr\/2026\/06\/14\/ssh-keygen-cle-ssh-authentification\/"},"modified":"2026-06-14T16:33:47","modified_gmt":"2026-06-14T16:33:47","slug":"ssh-keygen-cle-ssh-authentification","status":"publish","type":"post","link":"https:\/\/shattered.io\/fr\/2026\/06\/14\/ssh-keygen-cle-ssh-authentification\/","title":{"rendered":"ssh-keygen : cl\u00e9 SSH en 12 \u00e9tapes, 20 min [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Les mots de passe SSH sont le maillon faible de la plupart des serveurs expos\u00e9s sur Internet. Un serveur fra\u00eechement install\u00e9 re\u00e7oit des milliers de tentatives de connexion par force brute en quelques heures, et il suffit d&#8217;un mot de passe r\u00e9utilis\u00e9 pour qu&#8217;un attaquant prenne le contr\u00f4le. L&#8217;authentification par cl\u00e9 r\u00e8gle ce probl\u00e8me : \u00e0 la place d&#8217;un secret partag\u00e9 que l&#8217;on peut deviner, vous prouvez votre identit\u00e9 avec une cl\u00e9 cryptographique impossible \u00e0 brute-forcer. La commande <code>ssh-keygen<\/code>, livr\u00e9e avec OpenSSH, g\u00e9n\u00e8re cette paire de cl\u00e9s en quelques secondes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce tutoriel vous guide en 12 \u00e9tapes, de la g\u00e9n\u00e9ration d&#8217;une cl\u00e9 Ed25519 jusqu&#8217;au durcissement complet du serveur, en passant par la d\u00e9sactivation des mots de passe, les cl\u00e9s mat\u00e9rielles FIDO2 et l&#8217;\u00e9change de cl\u00e9s post-quantique introduit dans OpenSSH. Comptez environ 20 minutes pour un poste de travail Linux, macOS ou Windows et un serveur distant. Toutes les commandes sont pr\u00eates \u00e0 copier, avec des exemples de sortie et un d\u00e9pannage d\u00e9taill\u00e9 des erreurs les plus fr\u00e9quentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"authentification-ssh-par-cle-ce-qui-change-en-2026\">Authentification SSH par cl\u00e9 : ce qui change en 2026<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;authentification par cl\u00e9 publique repose sur une paire asym\u00e9trique : une cl\u00e9 <strong>priv\u00e9e<\/strong> que vous gardez sur votre machine et une cl\u00e9 <strong>publique<\/strong> que vous d\u00e9posez sur le serveur. Lors de la connexion, le serveur envoie un d\u00e9fi que seule la cl\u00e9 priv\u00e9e peut r\u00e9soudre. Le secret ne transite jamais sur le r\u00e9seau, contrairement \u00e0 un mot de passe. M\u00eame si quelqu&#8217;un intercepte la totalit\u00e9 de l&#8217;\u00e9change, il ne peut pas en d\u00e9duire votre cl\u00e9 priv\u00e9e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La version stable la plus r\u00e9cente, OpenSSH 10.3, a \u00e9t\u00e9 publi\u00e9e le 2 avril 2026. Plusieurs jalons r\u00e9cents expliquent pourquoi 2026 est un bon moment pour migrer vers les cl\u00e9s. OpenSSH 8.8 a d\u00e9sactiv\u00e9 l&#8217;algorithme de signature <code>ssh-rsa<\/code> qui d\u00e9pendait de SHA-1, OpenSSH 8.2 a introduit la prise en charge des cl\u00e9s de s\u00e9curit\u00e9 mat\u00e9rielles FIDO2, et OpenSSH 8.1 a ajout\u00e9 des protections m\u00e9moire pour la cl\u00e9 priv\u00e9e contre les attaques par canaux auxiliaires et par ex\u00e9cution sp\u00e9culative. En parall\u00e8le, OpenSSH a g\u00e9n\u00e9ralis\u00e9 l&#8217;\u00e9change de cl\u00e9s hybride post-quantique, d&#8217;abord avec <code>sntrup761x25519<\/code>, puis avec <code>mlkem768x25519<\/code>, pour r\u00e9sister aux futurs ordinateurs quantiques tout en restant compatible avec X25519.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concr\u00e8tement, une cl\u00e9 bien configur\u00e9e vous apporte trois b\u00e9n\u00e9fices imm\u00e9diats. D&#8217;abord, l&#8217;immunit\u00e9 totale \u00e0 la force brute en ligne : aucune liste de mots de passe ne peut deviner une cl\u00e9 Ed25519 de 256 bits. Ensuite, la possibilit\u00e9 de d\u00e9sactiver compl\u00e8tement l&#8217;authentification par mot de passe sur le serveur, ce qui r\u00e9duit la surface d&#8217;attaque \u00e0 z\u00e9ro pour cette cat\u00e9gorie d&#8217;attaques. Enfin, l&#8217;automatisation propre des scripts, sauvegardes et d\u00e9ploiements sans stocker de mot de passe en clair. Une cl\u00e9 prot\u00e9g\u00e9e par une bonne phrase de passe combine donc commodit\u00e9 et s\u00e9curit\u00e9, \u00e0 condition de respecter les permissions de fichiers que nous d\u00e9taillerons \u00e0 l&#8217;\u00e9tape 6.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prerequis-versions-dopenssh-et-outils-necessaires\">Pr\u00e9requis : versions d&#8217;OpenSSH et outils n\u00e9cessaires<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de g\u00e9n\u00e9rer la moindre cl\u00e9, v\u00e9rifiez que votre environnement dispose d&#8217;une version r\u00e9cente d&#8217;OpenSSH c\u00f4t\u00e9 client et c\u00f4t\u00e9 serveur. Les fonctions modernes (Ed25519, cl\u00e9s FIDO2, \u00e9change post-quantique) exigent des versions \u00e0 jour. Voici les pr\u00e9requis recommand\u00e9s pour ce tutoriel.<\/p>\n\n\n\n<figure class=\"wp-table\"><table><thead><tr><th>Composant<\/th><th>Version minimale<\/th><th>Recommand\u00e9 en 2026<\/th><th>R\u00f4le<\/th><\/tr><\/thead><tbody><tr><td>OpenSSH (client + serveur)<\/td><td>8.2<\/td><td>10.3 (avr. 2026)<\/td><td>G\u00e9n\u00e9ration de cl\u00e9s, FIDO2, post-quantique<\/td><\/tr><tr><td>Type de cl\u00e9 par d\u00e9faut<\/td><td>Ed25519<\/td><td>Ed25519<\/td><td>Algorithme de signature<\/td><\/tr><tr><td>Syst\u00e8me client<\/td><td>Linux, macOS 10.15+<\/td><td>Windows 10\/11 inclus<\/td><td>OpenSSH int\u00e9gr\u00e9 nativement<\/td><\/tr><tr><td>Acc\u00e8s serveur<\/td><td>Compte avec mot de passe<\/td><td>Compte sudo non-root<\/td><td>Pour d\u00e9poser la cl\u00e9 publique<\/td><\/tr><tr><td>Cl\u00e9 mat\u00e9rielle (option)<\/td><td>FIDO2 \/ U2F<\/td><td>YubiKey, Nitrokey<\/td><td>Cl\u00e9s <code>ed25519-sk<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sous Linux, OpenSSH est g\u00e9n\u00e9ralement pr\u00e9install\u00e9 ; sinon, installez le paquet <code>openssh-client<\/code> (Debian, Ubuntu) ou <code>openssh-clients<\/code> (Fedora, RHEL). Sous macOS, le client est livr\u00e9 avec le syst\u00e8me. Sous Windows 10 et 11, OpenSSH est disponible comme fonctionnalit\u00e9 facultative et accessible depuis PowerShell ou le Terminal Windows. Vous aurez aussi besoin d&#8217;un acc\u00e8s initial au serveur, typiquement par mot de passe, pour y copier votre cl\u00e9 publique. Travaillez toujours avec un compte utilisateur disposant de <code>sudo<\/code> plut\u00f4t qu&#8217;en <code>root<\/code> direct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dernier point de m\u00e9thode : gardez une seconde session SSH ouverte vers le serveur pendant tout le tutoriel. Lorsque vous modifierez la configuration de <code>sshd<\/code> aux \u00e9tapes 9 et 10, une erreur peut vous verrouiller dehors. Une session de secours d\u00e9j\u00e0 connect\u00e9e vous laisse une chance de corriger le tir sans passer par la console physique ou le panneau de secours de votre h\u00e9bergeur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ed25519-rsa-ecdsa-quel-algorithme-choisir\">Ed25519, RSA, ECDSA : quel algorithme choisir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le choix de l&#8217;algorithme conditionne la s\u00e9curit\u00e9 et les performances de votre cl\u00e9. OpenSSH proposait historiquement RSA par d\u00e9faut, puis a bascul\u00e9 vers Ed25519 dans les versions modernes. Aujourd&#8217;hui, Ed25519 est le choix recommand\u00e9 pour la grande majorit\u00e9 des cas d&#8217;usage. Le tableau suivant compare les quatre familles.<\/p>\n\n\n\n<figure class=\"wp-table\"><table><thead><tr><th>Type de cl\u00e9<\/th><th>Taille<\/th><th>Niveau de s\u00e9curit\u00e9<\/th><th>Vitesse<\/th><th>Recommandation 2026<\/th><\/tr><\/thead><tbody><tr><td>Ed25519<\/td><td>256 bits<\/td><td>~128 bits<\/td><td>Tr\u00e8s rapide<\/td><td>Choix par d\u00e9faut<\/td><\/tr><tr><td>RSA 4096<\/td><td>4096 bits<\/td><td>~128 bits<\/td><td>Lent \u00e0 g\u00e9n\u00e9rer<\/td><td>Compatibilit\u00e9 h\u00e9rit\u00e9e<\/td><\/tr><tr><td>RSA 3072<\/td><td>3072 bits<\/td><td>~112-128 bits<\/td><td>Moyen<\/td><td>Minimum acceptable<\/td><\/tr><tr><td>ECDSA<\/td><td>256-521 bits<\/td><td>~128-256 bits<\/td><td>Rapide<\/td><td>Second choix<\/td><\/tr><tr><td>ed25519-sk<\/td><td>256 bits + FIDO2<\/td><td>~128 bits + mat\u00e9riel<\/td><td>Rapide<\/td><td>Postes sensibles<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ed25519 s&#8217;impose pour plusieurs raisons. La cl\u00e9 est petite (256 bits) et de taille fixe, la g\u00e9n\u00e9ration et la v\u00e9rification sont tr\u00e8s rapides, et le niveau de s\u00e9curit\u00e9 avoisine 128 bits, \u00e9quivalent \u00e0 du RSA 3072 voire 4096 bits sans la lourdeur. La courbe Edwards 25519 a \u00e9t\u00e9 con\u00e7ue pour \u00e9viter les pi\u00e8ges d&#8217;impl\u00e9mentation qui ont historiquement affaibli ECDSA, notamment la d\u00e9pendance \u00e0 une source d&#8217;al\u00e9a de qualit\u00e9 \u00e0 chaque signature. Pour un usage interactif quotidien, Ed25519 est plus rapide, plus court et plus s\u00fbr.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RSA conserve un int\u00e9r\u00eat pour la compatibilit\u00e9 avec des \u00e9quipements anciens (vieux pare-feu, appliances, syst\u00e8mes embarqu\u00e9s) qui ne reconnaissent pas Ed25519. Dans ce cas, n&#8217;utilisez jamais moins de 3072 bits, et pr\u00e9f\u00e9rez 4096 bits pour les cl\u00e9s \u00e0 longue dur\u00e9e de vie. Attention : c&#8217;est l&#8217;algorithme de signature <code>ssh-rsa<\/code> bas\u00e9 sur SHA-1 qui a \u00e9t\u00e9 d\u00e9sactiv\u00e9 dans OpenSSH 8.8, pas les cl\u00e9s RSA elles-m\u00eames, qui restent prises en charge avec des signatures SHA-2 (<code>rsa-sha2-256<\/code> et <code>rsa-sha2-512<\/code>). ECDSA reste un second choix : il fonctionne, mais Ed25519 offre les m\u00eames garanties avec moins de surface d&#8217;erreur. R\u00e9servez ECDSA aux environnements qui l&#8217;imposent explicitement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-1-verifier-votre-installation-openssh\">\u00c9tape 1 : v\u00e9rifier votre installation OpenSSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Commencez par confirmer la version d&#8217;OpenSSH install\u00e9e, sur le client comme sur le serveur. La fonction <code>ssh-keygen<\/code> et les algorithmes disponibles d\u00e9pendent directement de cette version.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># C\u00f4t\u00e9 client : version d'OpenSSH\nssh -V\n\n# Sortie attendue (exemple)\n# OpenSSH_10.3p1, OpenSSL 3.5.0 1 Apr 2026\n\n# Lister les types de cl\u00e9s que ssh-keygen sait g\u00e9n\u00e9rer\nssh-keygen --help 2>&1 | grep -A1 \"key type\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La commande <code>ssh -V<\/code> affiche la version sur la sortie d&#8217;erreur standard, c&#8217;est normal. Si vous obtenez une version inf\u00e9rieure \u00e0 8.2, mettez \u00e0 jour avant de continuer, sinon les cl\u00e9s FIDO2 et l&#8217;\u00e9change post-quantique ne seront pas disponibles. Sous Windows, ouvrez PowerShell et lancez la m\u00eame commande ; si OpenSSH n&#8217;est pas reconnu, activez la fonctionnalit\u00e9 \u00ab Client OpenSSH \u00bb dans les param\u00e8tres de Windows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e9rifiez aussi le contenu de votre dossier <code>~\/.ssh<\/code>. S&#8217;il existe d\u00e9j\u00e0 des fichiers <code>id_ed25519<\/code> ou <code>id_rsa<\/code>, vous poss\u00e9dez peut-\u00eatre d\u00e9j\u00e0 une cl\u00e9. Ne l&#8217;\u00e9crasez pas \u00e0 l&#8217;aveugle : une cl\u00e9 \u00e9cras\u00e9e est d\u00e9finitivement perdue, avec tous les acc\u00e8s qui en d\u00e9pendent. Listez d&#8217;abord ce que vous avez.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Inspecter le dossier des cl\u00e9s\nls -la ~\/.ssh\n\n# Sortie possible\n# drwx------  2 user user 4096 14 juin 09:12 .\n# -rw-------  1 user user  411 14 juin 09:12 id_ed25519\n# -rw-r--r--  1 user user   99 14 juin 09:12 id_ed25519.pub<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-2-generer-une-paire-de-cles-avec-ssh-keygen\">\u00c9tape 2 : g\u00e9n\u00e9rer une paire de cl\u00e9s avec ssh-keygen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Place \u00e0 la commande centrale du tutoriel. Pour g\u00e9n\u00e9rer une cl\u00e9 Ed25519 moderne, ex\u00e9cutez <code>ssh-keygen<\/code> avec l&#8217;algorithme Ed25519 et un commentaire identifiant la cl\u00e9. Le commentaire (souvent votre adresse e-mail ou un libell\u00e9 machine) facilite le tri plus tard dans le fichier <code>authorized_keys<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># G\u00e9n\u00e9rer une cl\u00e9 Ed25519 avec ssh-keygen\nssh-keygen -t ed25519 -a 100 -C \"sam@portable-2026\" -f ~\/.ssh\/id_ed25519\n\n# Sortie interactive\n# Generating public\/private ed25519 key pair.\n# Enter passphrase (empty for no passphrase):\n# Enter same passphrase again:\n# Your identification has been saved in \/home\/sam\/.ssh\/id_ed25519\n# Your public key has been saved in \/home\/sam\/.ssh\/id_ed25519.pub\n# The key fingerprint is:\n# SHA256:Xy9c...e1Q sam@portable-2026<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9cortiquons les options. <code>-t ed25519<\/code> s\u00e9lectionne l&#8217;algorithme. <code>-a 100<\/code> fixe le nombre de tours de la fonction de d\u00e9rivation de cl\u00e9 qui prot\u00e8ge la cl\u00e9 priv\u00e9e (nous y revenons \u00e0 l&#8217;\u00e9tape 3). <code>-C<\/code> ajoute un commentaire descriptif. <code>-f<\/code> impose le chemin du fichier de sortie, ce qui \u00e9vite d&#8217;\u00e9craser une cl\u00e9 existante par accident. Si vous omettez <code>-f<\/code>, <code>ssh-keygen<\/code> propose le chemin par d\u00e9faut et vous demande confirmation avant d&#8217;\u00e9craser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour un cas qui exige RSA (compatibilit\u00e9 h\u00e9rit\u00e9e), la commande change peu : <code>ssh-keygen -t rsa -b 4096 -a 100 -C \"sam@legacy\"<\/code>. L&#8217;option <code>-b 4096<\/code> d\u00e9finit la taille en bits ; ne descendez jamais sous 3072. La g\u00e9n\u00e9ration RSA 4096 prend nettement plus de temps qu&#8217;Ed25519, parfois plusieurs secondes, c&#8217;est normal. \u00c0 l&#8217;issue de l&#8217;\u00e9tape, vous disposez de deux fichiers : la cl\u00e9 priv\u00e9e (<code>id_ed25519<\/code>, \u00e0 prot\u00e9ger absolument) et la cl\u00e9 publique (<code>id_ed25519.pub<\/code>, que vous pouvez diffuser librement).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-3-proteger-la-cle-privee-avec-une-phrase-de-passe\">\u00c9tape 3 : prot\u00e9ger la cl\u00e9 priv\u00e9e avec une phrase de passe<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une cl\u00e9 priv\u00e9e sans phrase de passe est un fichier qui donne un acc\u00e8s complet \u00e0 quiconque met la main dessus. Si votre ordinateur portable est vol\u00e9 ou si une sauvegarde fuite, une cl\u00e9 non chiffr\u00e9e se r\u00e9utilise instantan\u00e9ment. La phrase de passe chiffre la cl\u00e9 priv\u00e9e au repos : pour l&#8217;utiliser, il faut conna\u00eetre le secret.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lors de la g\u00e9n\u00e9ration, <code>ssh-keygen<\/code> vous demande deux fois la phrase de passe. Choisissez une phrase longue (quatre mots al\u00e9atoires ou plus), pas un mot de passe court. L&#8217;option <code>-a<\/code> contr\u00f4le le nombre de tours de la fonction de d\u00e9rivation de cl\u00e9 (KDF) appliqu\u00e9e \u00e0 cette phrase : plus la valeur est \u00e9lev\u00e9e, plus une attaque par dictionnaire sur la cl\u00e9 vol\u00e9e devient lente. La valeur 100 offre un bon compromis ; sur une machine r\u00e9cente, le d\u00e9verrouillage reste imperceptible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ajouter ou changer la phrase de passe d'une cl\u00e9 existante\nssh-keygen -p -a 200 -f ~\/.ssh\/id_ed25519\n\n# Sortie\n# Enter old passphrase:\n# Enter new passphrase (empty for no passphrase):\n# Enter same passphrase again:\n# Your identification has been saved with the new passphrase.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La commande <code>ssh-keygen -p<\/code> change la phrase de passe sans r\u00e9g\u00e9n\u00e9rer la cl\u00e9 : la paire reste identique, donc vous n&#8217;avez pas \u00e0 red\u00e9ployer la cl\u00e9 publique sur vos serveurs. C&#8217;est la bonne approche si vous aviez cr\u00e9\u00e9 une cl\u00e9 sans phrase de passe et que vous voulez la s\u00e9curiser apr\u00e8s coup. Pour \u00e9viter de saisir la phrase \u00e0 chaque connexion, vous chargerez la cl\u00e9 dans <code>ssh-agent<\/code> \u00e0 l&#8217;\u00e9tape 8 : vous la d\u00e9verrouillez une fois par session, puis l&#8217;agent s&#8217;en charge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-4-inspecter-et-comprendre-vos-fichiers-de-cles\">\u00c9tape 4 : inspecter et comprendre vos fichiers de cl\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de d\u00e9ployer quoi que ce soit, apprenez \u00e0 lire vos cl\u00e9s. La cl\u00e9 publique est une seule ligne de texte que vous pouvez afficher sans risque ; la cl\u00e9 priv\u00e9e ne doit jamais \u00eatre affich\u00e9e ni copi\u00e9e hors de la machine.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Afficher la cl\u00e9 publique\ncat ~\/.ssh\/id_ed25519.pub\n# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE9...k3l sam@portable-2026\n\n# Afficher l'empreinte (fingerprint) de la cl\u00e9\nssh-keygen -lf ~\/.ssh\/id_ed25519.pub\n# 256 SHA256:Xy9c...e1Q sam@portable-2026 (ED25519)\n\n# Afficher l'empreinte en art ASCII (pour comparaison visuelle)\nssh-keygen -lvf ~\/.ssh\/id_ed25519.pub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La cl\u00e9 publique se compose de trois champs : le type (<code>ssh-ed25519<\/code>), la donn\u00e9e encod\u00e9e en base64, puis le commentaire. C&#8217;est cette ligne que vous d\u00e9posez dans <code>authorized_keys<\/code> sur le serveur. L&#8217;empreinte SHA256 affich\u00e9e par <code>ssh-keygen -lf<\/code> est l&#8217;identifiant court de la cl\u00e9 : OpenSSH l&#8217;affiche lors de la premi\u00e8re connexion \u00e0 un h\u00f4te, et vous pouvez la comparer pour d\u00e9tecter une attaque de l&#8217;homme du milieu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un point souvent oubli\u00e9 : la cl\u00e9 publique peut \u00eatre r\u00e9g\u00e9n\u00e9r\u00e9e \u00e0 partir de la cl\u00e9 priv\u00e9e, mais l&#8217;inverse est impossible. Si vous perdez le fichier <code>.pub<\/code> mais conservez la cl\u00e9 priv\u00e9e, r\u00e9cup\u00e9rez-le ainsi.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Reconstruire la cl\u00e9 publique depuis la cl\u00e9 priv\u00e9e\nssh-keygen -y -f ~\/.ssh\/id_ed25519 > ~\/.ssh\/id_ed25519.pub<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-5-copier-la-cle-publique-sur-le-serveur\">\u00c9tape 5 : copier la cl\u00e9 publique sur le serveur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour autoriser votre cl\u00e9 sur le serveur, sa cl\u00e9 publique doit figurer dans <code>~\/.ssh\/authorized_keys<\/code> du compte distant. L&#8217;outil <code>ssh-copy-id<\/code> automatise cette op\u00e9ration : il se connecte une derni\u00e8re fois par mot de passe, cr\u00e9e le dossier <code>.ssh<\/code> si besoin, ajoute votre cl\u00e9 et r\u00e8gle les permissions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># M\u00e9thode recommand\u00e9e : ssh-copy-id\nssh-copy-id -i ~\/.ssh\/id_ed25519.pub sam@198.51.100.10\n\n# Sortie\n# Number of key(s) added: 1\n# Now try logging into the machine, with:   \"ssh 'sam@198.51.100.10'\"\n# and check to make sure that only the key(s) you wanted were added.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si <code>ssh-copy-id<\/code> n&#8217;est pas disponible (cas fr\u00e9quent sous Windows), copiez la cl\u00e9 manuellement. La commande suivante envoie votre cl\u00e9 publique et l&#8217;ajoute proprement au fichier distant, en cr\u00e9ant le dossier avec les bonnes permissions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># M\u00e9thode manuelle (depuis le client)\ncat ~\/.ssh\/id_ed25519.pub | ssh sam@198.51.100.10 \\\n  \"mkdir -p ~\/.ssh && chmod 700 ~\/.ssh && \\\n   cat >> ~\/.ssh\/authorized_keys && chmod 600 ~\/.ssh\/authorized_keys\"\n\n# Sous Windows PowerShell\ntype $env:USERPROFILE\\.ssh\\id_ed25519.pub | ssh sam@198.51.100.10 `\n  \"mkdir -p ~\/.ssh; cat >> ~\/.ssh\/authorized_keys\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Utilisez bien <code>&gt;&gt;<\/code> (ajout) et non <code>&gt;<\/code> (\u00e9crasement) : sinon vous remplacez toutes les cl\u00e9s d\u00e9j\u00e0 autoris\u00e9es, y compris celles de vos coll\u00e8gues ou de vos syst\u00e8mes automatis\u00e9s. Chaque cl\u00e9 occupe une ligne dans <code>authorized_keys<\/code> ; un compte peut en contenir plusieurs, une par appareil. Apr\u00e8s cette \u00e9tape, ne fermez pas encore votre session par mot de passe : testez d&#8217;abord la connexion par cl\u00e9 \u00e0 l&#8217;\u00e9tape 7.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-6-regler-les-permissions-de-ssh-et-authorized_keys\">\u00c9tape 6 : r\u00e9gler les permissions de ~\/.ssh et authorized_keys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH refuse d&#8217;utiliser une cl\u00e9 si les permissions de fichiers sont trop ouvertes. C&#8217;est une protection volontaire : si d&#8217;autres utilisateurs du syst\u00e8me peuvent lire ou modifier vos fichiers de cl\u00e9s, le serveur consid\u00e8re la cl\u00e9 comme compromise et l&#8217;ignore. La plupart des erreurs \u00ab Permission denied (publickey) \u00bb viennent en r\u00e9alit\u00e9 de permissions incorrectes.<\/p>\n\n\n\n<figure class=\"wp-table\"><table><thead><tr><th>Fichier ou dossier<\/th><th>Permission<\/th><th>Octal<\/th><th>Signification<\/th><\/tr><\/thead><tbody><tr><td><code>~\/.ssh<\/code><\/td><td><code>drwx------<\/code><\/td><td>700<\/td><td>Acc\u00e8s propri\u00e9taire uniquement<\/td><\/tr><tr><td><code>~\/.ssh\/authorized_keys<\/code><\/td><td><code>-rw-------<\/code><\/td><td>600<\/td><td>Lecture\/\u00e9criture propri\u00e9taire<\/td><\/tr><tr><td><code>~\/.ssh\/id_ed25519<\/code> (priv\u00e9e)<\/td><td><code>-rw-------<\/code><\/td><td>600<\/td><td>Cl\u00e9 priv\u00e9e, jamais lisible par d&#8217;autres<\/td><\/tr><tr><td><code>~\/.ssh\/id_ed25519.pub<\/code><\/td><td><code>-rw-r--r--<\/code><\/td><td>644<\/td><td>Cl\u00e9 publique, lecture autoris\u00e9e<\/td><\/tr><tr><td><code>~\/.ssh\/config<\/code><\/td><td><code>-rw-------<\/code><\/td><td>600<\/td><td>Configuration client<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Corriger les permissions sur le serveur (et sur le client)\nchmod 700 ~\/.ssh\nchmod 600 ~\/.ssh\/authorized_keys\nchmod 600 ~\/.ssh\/id_ed25519\nchmod 644 ~\/.ssh\/id_ed25519.pub\n\n# V\u00e9rifier aussi le propri\u00e9taire : le dossier doit appartenir \u00e0 l'utilisateur\nchown -R \"$USER\":\"$USER\" ~\/.ssh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le propri\u00e9taire compte autant que les bits de permission. Si <code>~\/.ssh<\/code> appartient \u00e0 <code>root<\/code> alors que vous vous connectez en tant que <code>sam<\/code>, OpenSSH refusera la cl\u00e9. V\u00e9rifiez aussi le dossier personnel lui-m\u00eame : un r\u00e9pertoire <code>home<\/code> accessible en \u00e9criture par le groupe (par exemple en 775) peut faire \u00e9chouer l&#8217;authentification, car un tiers pourrait y cr\u00e9er ou remplacer le dossier <code>.ssh<\/code>. En cas de doute, <code>chmod 750 ~<\/code> ou <code>chmod 700 ~<\/code> sur le serveur r\u00e9sout souvent un blocage persistant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-7-se-connecter-et-configurer-ssh-config\">\u00c9tape 7 : se connecter et configurer ~\/.ssh\/config<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Testez maintenant la connexion par cl\u00e9. Tant que l&#8217;authentification par mot de passe reste active, vous ne risquez pas de vous verrouiller : en cas d&#8217;\u00e9chec, le serveur retombera sur le mot de passe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Connexion avec mode verbeux pour diagnostiquer\nssh -v -i ~\/.ssh\/id_ed25519 sam@198.51.100.10\n\n# Lignes cl\u00e9s \u00e0 rep\u00e9rer dans la sortie\n# debug1: Offering public key: \/home\/sam\/.ssh\/id_ed25519 ED25519\n# debug1: Server accepts key: \/home\/sam\/.ssh\/id_ed25519 ED25519\n# debug1: Authentication succeeded (publickey).<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous voyez \u00ab Authentication succeeded (publickey) \u00bb, la cl\u00e9 fonctionne. Pour \u00e9viter de taper le chemin, l&#8217;adresse et l&#8217;utilisateur \u00e0 chaque fois, cr\u00e9ez un fichier <code>~\/.ssh\/config<\/code> sur le client. Vous pourrez alors \u00e9crire simplement <code>ssh prod<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ~\/.ssh\/config\nHost prod\n    HostName 198.51.100.10\n    User sam\n    IdentityFile ~\/.ssh\/id_ed25519\n    IdentitiesOnly yes\n    Port 22\n\nHost *\n    AddKeysToAgent yes\n    ServerAliveInterval 60<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;option <code>IdentitiesOnly yes<\/code> est importante : elle force OpenSSH \u00e0 n&#8217;essayer que la cl\u00e9 indiqu\u00e9e, au lieu de pr\u00e9senter toutes vos cl\u00e9s au serveur. Sans elle, un serveur peut rejeter votre connexion apr\u00e8s trop de tentatives rat\u00e9es si vous poss\u00e9dez de nombreuses cl\u00e9s. <code>AddKeysToAgent yes<\/code> charge automatiquement la cl\u00e9 dans l&#8217;agent au premier usage, et <code>ServerAliveInterval 60<\/code> \u00e9vite les d\u00e9connexions sur les sessions inactives.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-8-charger-la-cle-dans-ssh-agent\">\u00c9tape 8 : charger la cl\u00e9 dans ssh-agent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Saisir la phrase de passe \u00e0 chaque connexion devient vite p\u00e9nible. L&#8217;agent SSH garde la cl\u00e9 d\u00e9verrouill\u00e9e en m\u00e9moire pour la dur\u00e9e de votre session : vous tapez la phrase une seule fois, puis l&#8217;agent r\u00e9pond aux d\u00e9fis sans vous solliciter.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># D\u00e9marrer l'agent (si n\u00e9cessaire) et ajouter la cl\u00e9\neval \"$(ssh-agent -s)\"\n# Agent pid 4123\n\nssh-add ~\/.ssh\/id_ed25519\n# Enter passphrase for \/home\/sam\/.ssh\/id_ed25519:\n# Identity added: \/home\/sam\/.ssh\/id_ed25519 (sam@portable-2026)\n\n# Lister les cl\u00e9s charg\u00e9es\nssh-add -l\n# 256 SHA256:Xy9c...e1Q sam@portable-2026 (ED25519)\n\n# Ajouter une cl\u00e9 avec expiration automatique (1 heure)\nssh-add -t 3600 ~\/.ssh\/id_ed25519<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;option <code>-t 3600<\/code> fixe une dur\u00e9e de vie : apr\u00e8s une heure, l&#8217;agent oublie la cl\u00e9 et vous devrez la recharger. C&#8217;est une bonne pratique sur les postes partag\u00e9s. Sous macOS, ajoutez <code>--apple-use-keychain<\/code> pour m\u00e9moriser la phrase de passe dans le trousseau. Sous Windows, le service \u00ab Agent d&#8217;authentification OpenSSH \u00bb remplit le m\u00eame r\u00f4le ; activez-le puis utilisez <code>ssh-add<\/code> dans PowerShell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un mot d&#8217;avertissement sur la <strong>redirection d&#8217;agent<\/strong> (<code>ssh -A<\/code> ou <code>ForwardAgent yes<\/code>). Cette fonction expose le socket de votre agent sur le serveur distant : si ce serveur est compromis, l&#8217;attaquant peut s&#8217;en servir pour rebondir vers vos autres machines tant que votre session est ouverte. N&#8217;activez la redirection d&#8217;agent que vers des h\u00f4tes de confiance, et pr\u00e9f\u00e9rez <code>ProxyJump<\/code> (<code>ssh -J<\/code>) pour traverser un rebond sans exposer l&#8217;agent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-9-desactiver-lauthentification-par-mot-de-passe\">\u00c9tape 9 : d\u00e9sactiver l&#8217;authentification par mot de passe<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;est l&#8217;\u00e9tape qui s\u00e9curise r\u00e9ellement le serveur. Tant que le mot de passe reste accept\u00e9, les robots continueront leurs tentatives de force brute. Une fois votre connexion par cl\u00e9 valid\u00e9e, d\u00e9sactivez les mots de passe dans la configuration du d\u00e9mon SSH.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u00c9diter la configuration du serveur (sur le serveur)\nsudo nano \/etc\/ssh\/sshd_config\n\n# R\u00e9glages \u00e0 appliquer\nPubkeyAuthentication yes\nPasswordAuthentication no\nChallengeResponseAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin prohibit-password\nUsePAM yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sur les distributions r\u00e9centes, certains r\u00e9glages vivent dans des fichiers s\u00e9par\u00e9s sous <code>\/etc\/ssh\/sshd_config.d\/<\/code>. Un fichier comme <code>50-cloud-init.conf<\/code> peut r\u00e9activer <code>PasswordAuthentication yes<\/code> et \u00e9craser votre r\u00e9glage. V\u00e9rifiez l&#8217;ensemble avec <code>sudo sshd -T | grep -i passwordauthentication<\/code>, qui affiche la valeur r\u00e9ellement appliqu\u00e9e apr\u00e8s fusion de tous les fichiers.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Tester la configuration AVANT de red\u00e9marrer (d\u00e9tecte les erreurs de syntaxe)\nsudo sshd -t\n\n# Recharger le service sans couper les sessions existantes\nsudo systemctl reload ssh   # Debian\/Ubuntu\nsudo systemctl reload sshd  # Fedora\/RHEL\n\n# Confirmer la valeur effective\nsudo sshd -T | grep -i passwordauthentication\n# passwordauthentication no<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ne fermez surtout pas votre session de secours avant d&#8217;avoir ouvert une nouvelle connexion par cl\u00e9 dans un autre terminal. Si la nouvelle connexion r\u00e9ussit, vous pouvez fermer l&#8217;ancienne sereinement. Si elle \u00e9choue, votre session d\u00e9j\u00e0 ouverte vous permet de corriger <code>sshd_config<\/code> et de recharger le service sans perdre l&#8217;acc\u00e8s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-10-durcir-le-serveur-et-activer-le-post-quantique\">\u00c9tape 10 : durcir le serveur et activer le post-quantique<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Au-del\u00e0 de la d\u00e9sactivation des mots de passe, quelques r\u00e9glages renforcent nettement la posture du serveur. Ils limitent les algorithmes faibles, r\u00e9duisent la fen\u00eatre des attaques et activent l&#8217;\u00e9change de cl\u00e9s r\u00e9sistant au quantique.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Durcissement de \/etc\/ssh\/sshd_config\n# \u00c9change de cl\u00e9s hybride post-quantique en priorit\u00e9\nKexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,curve25519-sha256\n\n# N'accepter que les cl\u00e9s h\u00f4tes et algos de signature modernes\nHostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256\nPubkeyAcceptedAlgorithms ssh-ed25519,sk-ssh-ed25519@openssh.com,rsa-sha2-512\n\n# R\u00e9duire la surface d'attaque\nMaxAuthTries 3\nLoginGraceTime 20\nAllowUsers sam\nX11Forwarding no<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La directive <code>KexAlgorithms<\/code> place l&#8217;\u00e9change hybride post-quantique en t\u00eate. Le principe de l&#8217;hybride est simple : il combine un m\u00e9canisme post-quantique (ML-KEM 768, normalis\u00e9 par le NIST, ou NTRU Prime) avec X25519 classique. M\u00eame si l&#8217;un des deux est cass\u00e9, le secret reste prot\u00e9g\u00e9 par l&#8217;autre. Cela prot\u00e8ge contre la strat\u00e9gie \u00ab r\u00e9colter maintenant, d\u00e9chiffrer plus tard \u00bb, o\u00f9 un attaquant enregistre aujourd&#8217;hui le trafic chiffr\u00e9 pour le casser quand un ordinateur quantique sera disponible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>MaxAuthTries 3<\/code> coupe la connexion apr\u00e8s trois \u00e9checs, et <code>LoginGraceTime 20<\/code> r\u00e9duit le d\u00e9lai avant authentification, ce qui g\u00eane les attaques par \u00e9puisement de connexions. <code>AllowUsers<\/code> restreint la liste des comptes autoris\u00e9s \u00e0 se connecter en SSH. Pour aller plus loin, associez ce durcissement \u00e0 un outil de bannissement d&#8217;IP comme Fail2ban, qui bloque automatiquement les adresses trop insistantes. Testez toujours avec <code>sudo sshd -t<\/code> avant de recharger.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-11-cles-materielles-fido2-ed25519-sk\">\u00c9tape 11 : cl\u00e9s mat\u00e9rielles FIDO2 (ed25519-sk)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les comptes les plus sensibles, une cl\u00e9 mat\u00e9rielle FIDO2 (YubiKey, Nitrokey, etc.) lie la cl\u00e9 SSH \u00e0 un appareil physique. La partie secr\u00e8te ne quitte jamais le jeton : m\u00eame une machine enti\u00e8rement compromise ne peut pas voler la cl\u00e9, car chaque authentification exige une pr\u00e9sence physique (toucher le bouton du jeton).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># G\u00e9n\u00e9rer une cl\u00e9 SSH adoss\u00e9e \u00e0 un jeton FIDO2\nssh-keygen -t ed25519-sk -O resident -O verify-required \\\n  -C \"sam@yubikey\" -f ~\/.ssh\/id_ed25519_sk\n\n# Sortie\n# Generating public\/private ed25519-sk key pair.\n# You may need to touch your authenticator to authorize key generation.\n# Enter PIN for authenticator:\n# Your identification has been saved in \/home\/sam\/.ssh\/id_ed25519_sk<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le suffixe <code>-sk<\/code> (pour <em>security key<\/em>) indique une cl\u00e9 adoss\u00e9e \u00e0 un dispositif FIDO2, disponible depuis OpenSSH 8.2. L&#8217;option <code>-O resident<\/code> stocke une r\u00e9f\u00e9rence sur le jeton lui-m\u00eame, ce qui permet de r\u00e9cup\u00e9rer la cl\u00e9 sur une nouvelle machine. <code>-O verify-required<\/code> impose la saisie du code PIN du jeton \u00e0 chaque usage, en plus du toucher physique. D\u00e9ployez la cl\u00e9 publique <code>id_ed25519_sk.pub<\/code> exactement comme une cl\u00e9 classique, via <code>ssh-copy-id<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u00f4t\u00e9 serveur, autorisez ce type de cl\u00e9 avec <code>PubkeyAcceptedAlgorithms sk-ssh-ed25519@openssh.com<\/code> (d\u00e9j\u00e0 inclus \u00e0 l&#8217;\u00e9tape 10). Si vous changez de poste de travail, r\u00e9cup\u00e9rez les cl\u00e9s r\u00e9sidentes stock\u00e9es sur le jeton avec <code>ssh-keygen -K<\/code>, qui t\u00e9l\u00e9charge les r\u00e9f\u00e9rences depuis le mat\u00e9riel vers le dossier <code>.ssh<\/code> local. C&#8217;est la solution la plus robuste contre le vol de cl\u00e9, recommand\u00e9e pour les administrateurs et les acc\u00e8s \u00e0 privil\u00e8ges \u00e9lev\u00e9s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-12-rotation-revocation-et-inventaire-des-cles\">\u00c9tape 12 : rotation, r\u00e9vocation et inventaire des cl\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une cl\u00e9 SSH n&#8217;est pas \u00e9ternelle. La rotation r\u00e9guli\u00e8re limite l&#8217;impact d&#8217;une fuite pass\u00e9e inaper\u00e7ue. Planifiez un renouvellement (par exemple tous les 12 mois pour les cl\u00e9s personnelles, plus court pour les comptes de service) et r\u00e9voquez imm\u00e9diatement une cl\u00e9 apr\u00e8s la perte d&#8217;un appareil, le d\u00e9part d&#8217;un collaborateur ou un soup\u00e7on de compromission.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># R\u00e9voquer une cl\u00e9 : retirer sa ligne de authorized_keys sur le serveur\n# Rep\u00e9rer la cl\u00e9 par son commentaire\ngrep -n \"sam@ancien-portable\" ~\/.ssh\/authorized_keys\n\n# Supprimer la ligne correspondante (ex. ligne 2)\nsed -i '2d' ~\/.ssh\/authorized_keys\n\n# Lister toutes les empreintes autoris\u00e9es pour audit\nssh-keygen -lf ~\/.ssh\/authorized_keys<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les parcs importants, les <strong>certificats SSH<\/strong> simplifient la rotation. Au lieu de distribuer chaque cl\u00e9 publique sur chaque serveur, une autorit\u00e9 de certification (CA) signe les cl\u00e9s avec une dur\u00e9e de validit\u00e9 courte. Le serveur fait confiance \u00e0 la CA, pas \u00e0 chaque cl\u00e9 individuelle. Quand un certificat expire, l&#8217;acc\u00e8s cesse automatiquement, sans toucher aux fichiers <code>authorized_keys<\/code>. C&#8217;est l&#8217;approche privil\u00e9gi\u00e9e pour g\u00e9rer des centaines de serveurs sans dispersion de cl\u00e9s statiques.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Cr\u00e9er une CA et signer une cl\u00e9 utilisateur (aper\u00e7u)\nssh-keygen -t ed25519 -f ~\/.ssh\/ca_user -C \"CA utilisateur\"\nssh-keygen -s ~\/.ssh\/ca_user -I \"sam\" -n sam \\\n  -V +52w ~\/.ssh\/id_ed25519.pub\n# Signed user key ~\/.ssh\/id_ed25519-cert.pub: id \"sam\" valid 52 weeks<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pieges-courants-a-eviter\">Pi\u00e8ges courants \u00e0 \u00e9viter<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>\u00c9craser une cl\u00e9 existante.<\/strong> Lancer <code>ssh-keygen<\/code> sans <code>-f<\/code> et confirmer l&#8217;\u00e9crasement d\u00e9truit d\u00e9finitivement l&#8217;ancienne cl\u00e9 et tous les acc\u00e8s li\u00e9s. Listez toujours <code>~\/.ssh<\/code> avant de g\u00e9n\u00e9rer.<\/li><li><strong>Utiliser <code>&gt;<\/code> au lieu de <code>&gt;&gt;<\/code>.<\/strong> En copiant manuellement la cl\u00e9 publique, l&#8217;\u00e9crasement remplace toutes les cl\u00e9s autoris\u00e9es du compte distant au lieu d&#8217;ajouter la v\u00f4tre.<\/li><li><strong>Oublier la phrase de passe.<\/strong> Une cl\u00e9 priv\u00e9e sans phrase de passe est un acc\u00e8s complet en clair. En cas de vol du portable ou de fuite d&#8217;une sauvegarde, elle est r\u00e9utilisable imm\u00e9diatement.<\/li><li><strong>Permissions trop ouvertes.<\/strong> Un dossier <code>~\/.ssh<\/code> en 755 ou un <code>authorized_keys<\/code> en 644 fait silencieusement \u00e9chouer l&#8217;authentification par cl\u00e9. Respectez 700 et 600.<\/li><li><strong>Fermer la session de secours trop t\u00f4t.<\/strong> D\u00e9sactiver les mots de passe avant d&#8217;avoir valid\u00e9 la connexion par cl\u00e9 dans un nouveau terminal peut vous verrouiller hors du serveur.<\/li><li><strong>Activer la redirection d&#8217;agent partout.<\/strong> <code>ForwardAgent yes<\/code> vers un h\u00f4te non fiable expose votre agent et permet un rebond vers vos autres serveurs. R\u00e9servez-la aux h\u00f4tes de confiance.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"depannage-8-erreurs-ssh-frequentes\">D\u00e9pannage : 8 erreurs SSH fr\u00e9quentes<\/h2>\n\n\n\n<figure class=\"wp-table\"><table><thead><tr><th>Message d&#8217;erreur<\/th><th>Cause probable<\/th><th>Solution<\/th><\/tr><\/thead><tbody><tr><td><code>Permission denied (publickey)<\/code><\/td><td>Aucune cl\u00e9 accept\u00e9e par le serveur<\/td><td>V\u00e9rifier <code>authorized_keys<\/code>, permissions et bon utilisateur<\/td><\/tr><tr><td><code>Bad owner or permissions<\/code><\/td><td>Permissions de <code>~\/.ssh<\/code> trop ouvertes<\/td><td><code>chmod 700 ~\/.ssh<\/code> et <code>600<\/code> sur les fichiers<\/td><\/tr><tr><td><code>Agent admitted failure to sign<\/code><\/td><td>Cl\u00e9 non charg\u00e9e dans l&#8217;agent<\/td><td><code>ssh-add ~\/.ssh\/id_ed25519<\/code><\/td><\/tr><tr><td><code>Too many authentication failures<\/code><\/td><td>Trop de cl\u00e9s pr\u00e9sent\u00e9es<\/td><td>Ajouter <code>IdentitiesOnly yes<\/code> dans config<\/td><\/tr><tr><td><code>no matching host key type found<\/code><\/td><td>Algorithme d\u00e9sactiv\u00e9 (ex. <code>ssh-rsa<\/code>)<\/td><td>Migrer vers Ed25519 ou signatures SHA-2<\/td><\/tr><tr><td><code>Connection refused<\/code><\/td><td>Service SSH arr\u00eat\u00e9 ou mauvais port<\/td><td>V\u00e9rifier <code>systemctl status ssh<\/code> et le port<\/td><\/tr><tr><td><code>Host key verification failed<\/code><\/td><td>Cl\u00e9 h\u00f4te chang\u00e9e (r\u00e9installation)<\/td><td><code>ssh-keygen -R h\u00f4te<\/code> puis reconnexion<\/td><\/tr><tr><td><code>sign_and_send_pubkey: no mutual signature<\/code><\/td><td>Algorithme de signature non n\u00e9goci\u00e9<\/td><td>Activer <code>rsa-sha2-512<\/code> ou passer \u00e0 Ed25519<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La m\u00e9thode universelle de diagnostic reste le mode verbeux. Lancez <code>ssh -vvv sam@h\u00f4te<\/code> : la sortie montre chaque cl\u00e9 offerte, l&#8217;algorithme n\u00e9goci\u00e9 et la raison exacte d&#8217;un refus. C\u00f4t\u00e9 serveur, surveillez les journaux avec <code>sudo journalctl -u ssh -f<\/code> (ou <code>-u sshd<\/code> selon la distribution) pendant que vous tentez de vous connecter : vous y verrez le motif du rejet, souvent une question de permissions ou de propri\u00e9t\u00e9 de fichier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si une cl\u00e9 h\u00f4te a chang\u00e9 apr\u00e8s une r\u00e9installation l\u00e9gitime du serveur, OpenSSH bloque la connexion par s\u00e9curit\u00e9. Retirez l&#8217;ancienne entr\u00e9e avec <code>ssh-keygen -R 198.51.100.10<\/code>, puis reconnectez-vous et v\u00e9rifiez l&#8217;empreinte affich\u00e9e avant d&#8217;accepter la nouvelle cl\u00e9. Ne supprimez jamais cette entr\u00e9e sans avoir confirm\u00e9 que le changement est l\u00e9gitime : c&#8217;est pr\u00e9cis\u00e9ment le m\u00e9canisme qui d\u00e9tecte une attaque de l&#8217;homme du milieu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"astuces-avancees-pour-gerer-vos-cles-a-grande-echelle\">Astuces avanc\u00e9es pour g\u00e9rer vos cl\u00e9s \u00e0 grande \u00e9chelle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs techniques font gagner du temps une fois les bases acquises. Le <strong>multiplexage de connexions<\/strong> r\u00e9utilise une connexion TCP existante pour les suivantes vers le m\u00eame h\u00f4te, ce qui acc\u00e9l\u00e8re les commandes r\u00e9p\u00e9t\u00e9es et les transferts de fichiers. Ajoutez ces lignes \u00e0 votre <code>~\/.ssh\/config<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Multiplexage : connexions plus rapides vers le m\u00eame h\u00f4te\nHost *\n    ControlMaster auto\n    ControlPath ~\/.ssh\/sockets\/%r@%h:%p\n    ControlPersist 10m\n\n# Cr\u00e9er le dossier des sockets\nmkdir -p ~\/.ssh\/sockets && chmod 700 ~\/.ssh\/sockets<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>rebond<\/strong> via <code>ProxyJump<\/code> (<code>ssh -J bastion sam@interne<\/code>) traverse un serveur interm\u00e9diaire sans exposer votre agent, contrairement \u00e0 la redirection d&#8217;agent. C&#8217;est la bonne mani\u00e8re d&#8217;atteindre un serveur interne derri\u00e8re un bastion. Pour les environnements g\u00e9r\u00e9s, combinez cl\u00e9s et certificats SSH : une CA signe des certificats \u00e0 courte dur\u00e9e de vie, et les serveurs ne font confiance qu&#8217;\u00e0 la CA, ce qui supprime la dispersion de cl\u00e9s statiques et simplifie la rotation d\u00e9crite \u00e0 l&#8217;\u00e9tape 12.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, s\u00e9parez vos cl\u00e9s par usage : une cl\u00e9 pour le travail, une pour les serveurs personnels, une pour les services Git (GitHub, GitLab). Cette segmentation limite l&#8217;impact d&#8217;une compromission et facilite la r\u00e9vocation cibl\u00e9e. Combin\u00e9e \u00e0 <code>IdentitiesOnly yes<\/code> dans la configuration, elle garantit que chaque h\u00f4te ne re\u00e7oit que la cl\u00e9 qui le concerne. Pour aller plus loin sur la s\u00e9curit\u00e9 des acc\u00e8s, consultez nos guides sur le durcissement de SSH avec Fail2ban et la mise en place de VPN.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"questions-frequentes-sur-ssh-keygen\">Questions fr\u00e9quentes sur ssh-keygen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ed25519-ou-rsa-que-choisir-en-2026\">Ed25519 ou RSA : que choisir en 2026 ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Choisissez Ed25519 par d\u00e9faut. Il est plus rapide, g\u00e9n\u00e8re des cl\u00e9s courtes et offre un niveau de s\u00e9curit\u00e9 d&#8217;environ 128 bits, \u00e9quivalent \u00e0 RSA 3072-4096 bits. Ne r\u00e9servez RSA (4096 bits minimum, jamais sous 3072) qu&#8217;aux \u00e9quipements anciens qui ne reconnaissent pas Ed25519.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faut-il-vraiment-une-phrase-de-passe-sur-la-cle-privee\">Faut-il vraiment une phrase de passe sur la cl\u00e9 priv\u00e9e ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oui. Sans phrase de passe, la cl\u00e9 priv\u00e9e donne un acc\u00e8s complet \u00e0 quiconque la copie. La phrase de passe chiffre la cl\u00e9 au repos. Combin\u00e9e \u00e0 <code>ssh-agent<\/code>, elle ne se saisit qu&#8217;une fois par session, donc le confort est pr\u00e9serv\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pourquoi-jobtiens-permission-denied-publickey\">Pourquoi j&#8217;obtiens \u00ab Permission denied (publickey) \u00bb ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dans la majorit\u00e9 des cas, ce sont des permissions de fichiers trop ouvertes : le dossier <code>~\/.ssh<\/code> doit \u00eatre en 700 et <code>authorized_keys<\/code> en 600, avec le bon propri\u00e9taire. V\u00e9rifiez aussi que la cl\u00e9 publique figure bien dans <code>authorized_keys<\/code> du bon compte. Le mode <code>ssh -vvv<\/code> pr\u00e9cise la cause exacte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"comment-changer-la-phrase-de-passe-sans-regenerer-la-cle\">Comment changer la phrase de passe sans r\u00e9g\u00e9n\u00e9rer la cl\u00e9 ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utilisez <code>ssh-keygen -p -f ~\/.ssh\/id_ed25519<\/code>. La paire de cl\u00e9s reste identique, donc vous n&#8217;avez pas \u00e0 red\u00e9ployer la cl\u00e9 publique sur vos serveurs. C&#8217;est aussi la commande pour ajouter une phrase de passe \u00e0 une cl\u00e9 qui n&#8217;en avait pas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"une-cle-ssh-est-elle-resistante-aux-ordinateurs-quantiques\">Une cl\u00e9 SSH est-elle r\u00e9sistante aux ordinateurs quantiques ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La signature Ed25519 reste vuln\u00e9rable \u00e0 un futur ordinateur quantique, mais OpenSSH prot\u00e8ge d\u00e9j\u00e0 l&#8217;<em>\u00e9change de cl\u00e9s<\/em> de session avec des sch\u00e9mas hybrides post-quantiques (<code>mlkem768x25519<\/code>, <code>sntrup761x25519<\/code>). Activez-les via <code>KexAlgorithms<\/code> comme \u00e0 l&#8217;\u00e9tape 10 pour contrer la strat\u00e9gie \u00ab r\u00e9colter maintenant, d\u00e9chiffrer plus tard \u00bb.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"puis-je-utiliser-la-meme-cle-sur-plusieurs-serveurs\">Puis-je utiliser la m\u00eame cl\u00e9 sur plusieurs serveurs ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Techniquement oui, en d\u00e9posant la m\u00eame cl\u00e9 publique sur chaque serveur. Mais pour limiter l&#8217;impact d&#8217;une fuite, mieux vaut une cl\u00e9 par contexte (travail, perso, Git). En cas de compromission, vous ne r\u00e9voquez qu&#8217;une cl\u00e9 sans casser tous vos acc\u00e8s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quelle-version-dopenssh-faut-il-au-minimum\">Quelle version d&#8217;OpenSSH faut-il au minimum ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH 8.2 suffit pour Ed25519 et les cl\u00e9s FIDO2, mais visez la version stable la plus r\u00e9cente (10.3, avril 2026) pour b\u00e9n\u00e9ficier de l&#8217;\u00e9change post-quantique par d\u00e9faut et des derniers correctifs de s\u00e9curit\u00e9. V\u00e9rifiez avec <code>ssh -V<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"related-coverage\">Related Coverage<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/fr\/fail2ban-proteger-ssh-tutoriel\/\">Fail2ban : prot\u00e9ger SSH en 12 \u00e9tapes, 30 min<\/a><\/li><li><a href=\"\/fr\/vpn-wireguard-linux\/\">VPN WireGuard sur Linux : 12 \u00e9tapes, 30 min<\/a><\/li><li><a href=\"\/fr\/chiffrer-fichier-gpg-tutoriel\/\">GPG : chiffrer fichiers et emails, 12 \u00e9tapes<\/a><\/li><li><a href=\"\/fr\/certificat-ssl-certbot-nginx\/\">Certificat SSL gratuit avec Certbot : 11 \u00e9tapes<\/a><\/li><li><a href=\"\/fr\/securite-des-mots-de-passe\/\">S\u00e9curit\u00e9 des mots de passe : longueur, hachage et gestionnaires<\/a><\/li><li><a href=\"\/fr\/security-hub\/\">S\u00e9curit\u00e9 en ligne : prot\u00e9ger ses donn\u00e9es et ses acc\u00e8s<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Sources et r\u00e9f\u00e9rences : <a href=\"https:\/\/www.openssh.com\/releasenotes.html\" target=\"_blank\" rel=\"noopener\">notes de version OpenSSH<\/a>, <a href=\"https:\/\/man.openbsd.org\/ssh-keygen\" target=\"_blank\" rel=\"noopener\">manuel ssh-keygen (OpenBSD)<\/a>, <a href=\"https:\/\/www.ssh.com\/academy\/ssh\/keygen\" target=\"_blank\" rel=\"noopener\">SSH Academy : ssh-keygen<\/a>, <a href=\"https:\/\/infosec.mozilla.org\/guidelines\/openssh\" target=\"_blank\" rel=\"noopener\">Mozilla OpenSSH Security Guidelines<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/EdDSA\" target=\"_blank\" rel=\"noopener\">EdDSA (Ed25519)<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les mots de passe SSH sont le maillon faible de la plupart des serveurs expos\u00e9s sur Internet. Un serveur fra\u00eechement install\u00e9 re\u00e7oit des milliers de tentatives de connexion par force\u2026<\/p>\n","protected":false},"author":9,"featured_media":151,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,3],"tags":[],"class_list":["post-150","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-10","category-security"],"_links":{"self":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/comments?post=150"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/150\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/150\/revisions\/152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media\/151"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media?parent=150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/categories?post=150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/tags?post=150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}