Skip to content

Instantly share code, notes, and snippets.

@stephdl
Created December 21, 2025 17:03
Show Gist options
  • Select an option

  • Save stephdl/7040fcea823c2293c8b354f0b1628955 to your computer and use it in GitHub Desktop.

Select an option

Save stephdl/7040fcea823c2293c8b354f0b1628955 to your computer and use it in GitHub Desktop.
Générer des clés ssh et les utiliser

Guide SSH : Création de clés et authentification par clé

Documentation basée sur les man pages de ssh-keygen, ssh-copy-id et sshd_config.

1. Créer une clé SSH

Génération avec passphrase (recommandé)

ssh-keygen -t ed25519 -C "utilisateur@exemple.com"

Vous serez invité à :

  1. Spécifier le chemin du fichier (défaut : ~/.ssh/id_ed25519)
  2. Saisir une passphrase pour chiffrer la clé privée

Passphrase : Une chaîne de caractères (peut être vide) qui chiffre la clé privée avec AES 128-bit. Selon le man : « une bonne passphrase fait 10-30 caractères, n'est pas une phrase simple facilement devinable, et contient un mélange de majuscules, minuscules, chiffres et caractères non alphanumériques ».

Génération sans passphrase

ssh-keygen -t ed25519 -C "utilisateur@exemple.com" -N ""

L'option -N "" spécifie une passphrase vide (pas d'invite interactive).

Autres types de clés

# RSA (4096 bits pour plus de sécurité)
ssh-keygen -t rsa -b 4096 -C "utilisateur@exemple.com"

# ECDSA
ssh-keygen -t ecdsa -C "utilisateur@exemple.com"

Note : Ed25519 est recommandé pour les nouvelles clés (meilleure sécurité, plus court).

Options courantes

Option Description
-t type Type de clé : rsa, dsa, ecdsa, ed25519
-b bits Nombre de bits (RSA min 2048, défaut 3072)
-f fichier Chemin du fichier de clé
-C commentaire Commentaire pour identifier la clé
-N passphrase Passphrase (pas d'invite)
-q Mode silencieux

Fichiers générés

  • ~/.ssh/id_ed25519 : Clé privée (à garder secrète)
  • ~/.ssh/id_ed25519.pub : Clé publique (à installer sur les serveurs)

2. Uploader la clé publique avec ssh-copy-id

ssh-copy-id automatise l'installation de votre clé publique sur un serveur distant. Selon le man, c'est un script qui utilise SSH pour se connecter à une machine distante et ajoute votre clé à ~/.ssh/authorized_keys en gérant les permissions correctement.

Utilisation simple

ssh-copy-id -i ~/.ssh/id_ed25519.pub utilisateur@serveur.com

ou plus simplement (détecte automatiquement la clé publique) :

ssh-copy-id utilisateur@serveur.com

Avec port personnalisé

ssh-copy-id -p 2222 utilisateur@serveur.com

Options utiles

Option Description
-i fichier Chemin explicite de la clé publique
-p port Port SSH (défaut 22)
-f Mode forcé (pas de vérification)
-n Simulation (dry-run)
-s Mode SFTP (si commandes limitées sur serveur)

Ce que fait ssh-copy-id

  1. Se connecte au serveur distant (vous demande le mot de passe)
  2. Crée ~/.ssh s'il n'existe pas
  3. Ajoute votre clé publique à ~/.ssh/authorized_keys
  4. Fixe les permissions : ~/.ssh = 700, authorized_keys = 600
  5. Supprime les droits de groupe/autres pour éviter les erreurs StrictModes

Important : Nécessite que l'authentification par mot de passe soit activée sur le serveur (au moins temporairement).

3. Configurer le serveur SSH pour n'accepter que les clés

Éditer /etc/ssh/sshd_config sur le serveur :

sudo nano /etc/ssh/sshd_config

Configuration minimale

# Activer l'authentification par clé publique (déjà par défaut)
PubkeyAuthentication yes

# Désactiver l'authentification par mot de passe
PasswordAuthentication no

Configuration sécurisée complète

# Authentification
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

# Fichier des clés autorisées
AuthorizedKeysFile .ssh/authorized_keys

# Sécurité
Protocol 2
PermitRootLogin no
MaxAuthTries 3

# Autres options recommandées
ClientAliveInterval 300
ClientAliveCountMax 2

Appliquer les modifications

# Vérifier la syntaxe (important!)
sudo sshd -t

# Redémarrer SSH
sudo systemctl restart ssh
# ou sur certains systèmes
sudo systemctl restart sshd

Vérifier les paramètres

# Afficher les paramètres actifs
sudo sshd -T | grep -i auth

# Ou consulter directement
sudo grep -E "^(Pubkey|Password)Authentication" /etc/ssh/sshd_config

4. Permissions critiques

Le man sshd_config stipule que StrictModes vérifie les permissions. Si elles sont incorrectes, la connexion échoue.

# Sur le client
ls -la ~/.ssh/
# Doit montrer : drwx------ (700) pour ~/.ssh

# Sur le serveur
ls -la ~/.ssh/authorized_keys
# Doit montrer : -rw------- (600) pour authorized_keys

Corriger si nécessaire :

# Sur le serveur
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

5. Workflow complet

Côté client

# 1. Créer la clé
ssh-keygen -t ed25519 -C "mon.utilisateur@exemple.com"

# 2. Uploader la clé
ssh-copy-id -i ~/.ssh/id_ed25519.pub utilisateur@serveur.example.com

# 3. Tester la connexion
ssh utilisateur@serveur.example.com

Côté serveur

# 1. Éditer la configuration
sudo nano /etc/ssh/sshd_config

# 2. Mettre à jour comme indiqué plus haut
# PubkeyAuthentication yes
# PasswordAuthentication no

# 3. Valider la syntaxe
sudo sshd -t

# 4. Redémarrer
sudo systemctl restart ssh

# 5. Vérifier les permissions (ssh-copy-id s'en charge normalement)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

6. Dépannage

Authentification échouée mais clé present dans authorized_keys

# Vérifier les permissions
ls -la ~/.ssh/authorized_keys
# Doit être 600 (ou -rw-------)

# Vérifier la clé publique
cat ~/.ssh/authorized_keys
# Doit commencer par ssh-ed25519 ou ssh-rsa

ssh-copy-id échoue

# Vérifier que le mot de passe fonctionne
ssh utilisateur@serveur.com

# Essayer avec explicite
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 utilisateur@serveur.com

Clé ignorée, fallback sur mot de passe

# Activer le mode verbose
ssh -vv utilisateur@serveur.com

# Chercher les lignes "Trying private key:" et "Authentications that can continue"

Régénérer la passphrase d'une clé existante

ssh-keygen -p -f ~/.ssh/id_ed25519

Le man indique : « change la passphrase d'un fichier de clé privée existante au lieu de créer une nouvelle clé ».


Références : man ssh-keygen, man ssh-copy-id, man sshd_config

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment