Configurer une clé SSH

Ce guide explique comment configurer une clé SSH pour cloner, pousser et gérer tous vos dépôts Gitea sans mot de passe.

1. Une seule clé suffit pour tous vos dépôts

En SSH, la clé publique est rattachée à votre compte utilisateur Gitea, pas à un dépôt en particulier. Une fois ajoutée une seule fois dans Paramètres → Clés SSH/GPG, elle vous donne accès en SSH à :

Inutile donc de créer une clé par dépôt.

2. Générer une clé SSH (si vous n'en avez pas déjà une)

ssh-keygen -t ed25519 -C "votre_email@example.com" -f ~/.ssh/id_ed25519_gitea

3. Ajouter la clé publique à votre compte Gitea

Afficher la clé publique à copier :

cat ~/.ssh/id_ed25519_gitea.pub

Dans l'interface web de Gitea :

  1. Paramètres du compte (icône profil, en haut à droite) → Clés SSH/GPG
  2. Ajouter une clé → coller le contenu de id_ed25519_gitea.pub
  3. Donner un nom explicite à la clé (ex : laptop-perso, poste-bureau) — utile pour la révoquer précisément plus tard sans casser l'accès de vos autres machines
  4. Valider

4. Configurer le client SSH (~/.ssh/config)

Le serveur SSH intégré de Gitea écoute sur le port 2222 (et non 22). Un alias dans ~/.ssh/config évite d'avoir à le préciser à chaque commande :

Host git.mondomain.ovh
    HostName git.mondomain.ovh
    Port 2222
    User git
    IdentityFile ~/.ssh/id_ed25519_gitea
    IdentitiesOnly yes
chmod 600 ~/.ssh/config

5. Tester la connexion

ssh -T git@git.mondomain.ovh

Réponse attendue :

Hi <votre_nom_utilisateur>! You've successfully authenticated, but Gitea does not provide shell access.

C'est normal : Gitea confirme l'authentification mais ne donne volontairement pas de shell.

Sans l'alias ~/.ssh/config configuré à l'étape 4 :

ssh -T -p 2222 git@git.mondomain.ovh

6. Cloner, pousser, committer

Cloner un nouveau dépôt (avec l'alias configuré) :

git clone git@git.mondomain.ovh:USER/REPO.git

Sans alias :

git clone ssh://git@git.mondomain.ovh:2222/USER/REPO.git

Basculer un dépôt existant (cloné en HTTP) vers SSH :

git remote set-url origin git@git.mondomain.ovh:USER/REPO.git

Ensuite, git add, git commit, git push, git pull fonctionnent normalement : l'authentification est entièrement gérée par la clé SSH, plus besoin de nom d'utilisateur ni de mot de passe/token.

7. Bonnes pratiques (DevSecOps)

8. Dépannage

Symptôme Cause probable Solution
Permission denied (publickey) Clé non ajoutée dans Gitea, ou mauvaise clé utilisée ssh -vT git@git.mondomain.ovh pour voir quelle clé est proposée ; vérifier qu'elle correspond bien à celle ajoutée dans Gitea
Permission denied (publickey) malgré une clé correcte Plusieurs clés dans l'agent SSH, la mauvaise est essayée en premier Ajouter IdentitiesOnly yes dans ~/.ssh/config (voir §4)
ssh: connect to host ... port 22: Connection refused Le port 2222 n'est pas utilisé (alias non configuré ou oublié dans l'URL) Utiliser l'alias ~/.ssh/config, ou ssh://git@git.mondomain.ovh:2222/...
Timeout / Connection refused sur le port 2222 Port fermé côté pare-feu ou conteneur non démarré sudo ufw status côté serveur ; docker compose ps (le port 2222 doit apparaître)
Bad permissions / clé ignorée par SSH Droits trop ouverts sur ~/.ssh ou la clé privée chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519_gitea
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! qui revient à chaque redémarrage du conteneur Clés hôte SSH du serveur (pas de votre poste) illisibles par le conteneur — voir §9 Corriger les permissions de data/data/ssh/ côté serveur (voir §9)

Clé refusé après redémarrage du service

Côté serveur : la clé hôte change à chaque redémarrage du conteneur

Symptôme : l'avertissement "REMOTE HOST IDENTIFICATION HAS CHANGED" réapparaît après chaque redémarrage de gitea, même en supprimant l'entrée dans known_hosts et en faisant confiance à la nouvelle clé à chaque fois — le fingerprint proposé change encore la fois suivante.

Cause : les fichiers de clés hôte SSH persistées (data/data/ssh/gitea.rsa, ssh_host_ecdsa_key, ssh_host_ed25519_key...) appartiennent à root:root en mode 600 au lieu de 1000:1000 (l'UID git du conteneur rootless). Gitea échoue silencieusement à charger ces clés persistées — visible dans les logs :

docker compose logs gitea | grep -i -A1 "Adding SSH host key"
# [I] Adding SSH host key: /var/lib/gitea/data/ssh/gitea.rsa
# [E] Failed to set Host Key. open /var/lib/gitea/data/ssh/gitea.rsa: permission denied

Le serveur SSH démarre quand même, mais avec une clé hôte générée en mémoire, différente à chaque redémarrage du conteneur — d'où l'avertissement qui revient sans cesse, même après avoir fait confiance à la clé précédente : elle n'est jamais la même deux fois.

Ce cas survient typiquement après une restauration/migration manuelle où le dossier ssh/ a été copié avec sudo séparément du reste des données (voir aussi BACKUP.md, §7, sur la correspondance UID à respecter côté serveur).

Correction, côté serveur :

sudo chown -R 1000:1000 data/data/ssh
docker compose restart gitea

# Vérifier que le chargement réussit désormais (plus de ligne [E])
docker compose logs gitea | grep -i -A1 "Adding SSH host key"

Puis côté client, une dernière fois (la clé hôte restera stable à partir de maintenant) :

ssh-keygen -f ~/.ssh/known_hosts -R "[git.mondomain.ovh]:2222"
ssh -T -p 2222 git@git.mondomain.ovh

Revision #2
Created 31 July 2026 15:26:41 by gpatruno
Updated 31 July 2026 15:28:46 by gpatruno