L’uti­li­sa­tion d’une SSH key avec GitHub permet un accès sans mot de passe aux ré­fé­ren­tiels Git. Au lieu d’iden­ti­fier un uti­li­sa­teur par son nom d’uti­li­sa­teur et son mot de passe, la machine du dé­ve­lop­peur est au­then­ti­fiée par la clé SSH.

Une clé SSH, c’est quoi ?

Secure Shell (SSH) est l’outil par défaut pour l’accès chiffré aux systèmes distants. SSH permet de se connecter à un serveur à partir d’une machine de dé­ve­lop­pe­ment locale. Github utilise SSH comme protocole de trans­mis­sion et permet l’accès en lecture et en écriture aux ré­fé­ren­tiels distants.

Une connexion chiffrée est utilisée pour permettre l’au­then­ti­fi­ca­tion de la machine et pour garantir l’intégrité des données trans­mises. Sans celle-ci, des tiers seraient en mesure d’apporter des mo­di­fi­ca­tions aux ré­fé­ren­tiels.

Github via SSH utilise le chif­fre­ment asy­mé­trique comme méthode de chif­fre­ment. Ce faisant, une paire de clés privée et publique est créée dans un premier temps. EIle est également nommée « Public-Private Keypair ». La clé privée reste sur l’or­di­na­teur personnel, tandis que la clé publique est partagée avec des tiers comme GitHub.

Quand vous utilisez une SSH key pour accéder aux ré­fé­ren­tiels GitHub, vous n’avez pas besoin d’entrer de mot de passe. En général, la connexion sans mot de passe est con­si­dé­rée comme plus sûre, car les en­re­gis­treurs de frappe ou les chevaux de Troie ne peuvent ainsi pas espionner et accéder à vos données. Au lieu d’une personne con­nais­sant le mot de passe, on utilise donc une machine sur laquelle la clé privée est stockée.

L’uti­li­sa­tion de GitHub via SSH est très pratique. Une fois con­fi­gu­rée, la clé SSH permet un accès permanent à GitHub sans aucune autre in­ter­ven­tion. D’autres pro­to­coles et services ex­ploi­tent également les clés SSH pour une connexion réseau chiffrée. Le protocole SFTP sécurisé peut également être utilisé pour échanger des fichiers avec des serveurs sans con­fi­gu­ra­tion sup­plé­men­taire.

La connexion aux ré­fé­ren­tiels Git est effectuée gé­né­ra­le­ment dans l’invite de ligne de commande. Une fois la clé SSH con­fi­gu­rée, vous pouvez fa­ci­le­ment la pousser vers votre propre ré­fé­ren­tiel :

cd ./folder-with-git-repo/
git push

En plus de l’ap­pli­ca­tion de ligne de commande, les ap­pli­ca­tions avec interface graphique profitent également de la con­fi­gu­ra­tion d’une clé SSH. Les pro­grammes FTP modernes prennent en charge le protocole de transfert de fichiers SSH (SFTP). Cette fonction est basée sur SSH et fait appel à des clés SSH exis­tantes.

Comment utiliser les SSH keys avec GitHub

Pour accéder à votre compte GitHub à l’aide d’une SSH key, en­re­gis­trez la clé publique sur GitHub. La clé privée reste sur l’or­di­na­teur personnel. La machine de dé­ve­lop­pe­ment est au­then­ti­fiée auprès de GitHub en comparant les données de clé. Cela permet un accès en écriture à vos propres ré­fé­ren­tiels. Cette méthode fonc­tionne également avec des al­ter­na­tives à GitHub comme Gitlab ou Bitbucket.

Aussi pratique que sont les clés SSH, il convient toutefois de les manipuler avec pré­cau­tion. Ne partagez sous aucun prétexte la clé privée : si elle tombe entre de mauvaises mains, elle permettra à un tiers de s’au­then­ti­fier à votre place. En votre nom, quelqu’un pourrait ainsi se connecter à un serveur ou modifier le code dans les ré­fé­ren­tiels.

Con­di­tions requises pour l’uti­li­sa­tion de SSH key avec GitHub

Nous supposons que vous tra­vail­lez dans un en­vi­ron­ne­ment de type Linux. Il s’agit notamment de Linux/Unix, macOS et Windows sur lesquels WSL2 est installé. Les con­di­tions suivantes doivent également être remplies :

  • Git est installé
  • SSH est installé
  • Un compte GitHub a été créé

Com­men­çons par vérifier si les con­di­tions locales requises sont res­pec­tées. La commande suivante nous permet de tester si Git et SSH sont installés. Si vous ne recevez pas de message d’erreur « git not found » ou « ssh not found » s’afficher, cela signifie que les deux sont bien présents :

which git ssh
Image: Test de l’installation de Git et SSH
Git et SSH sont installés sur notre système. Nous re­cher­chons une commande « unknown » inexis­tante à titre d’exemple.

Nous créons également le ré­per­toire .ssh dans le dossier uti­li­sa­teur s’il n’existe pas déjà :

mkdir -vp ~/.ssh/

Nous ex­pli­que­rons ci-dessous comment créer et en­re­gis­trer une clé SSH pour utiliser GitHub. Une fois cette étape terminée, nous vous montrons comment en­re­gis­trer la clé SSH publique sur GitHub et vous ex­pli­quons comment accéder aux ré­fé­ren­tiels Git via SSH :

  1. Créer une paire de clés SSH sur son propre système
  2. En­re­gis­trer la clé SSH publique sur GitHub
  3. Utiliser la clé SSH pour accéder au ré­fé­ren­tiel GitHub

Créer et en­re­gis­trer une clé SSH sur son propre système

Dans un premier temps, nous allons créer une paire de clés SSH publique/privée sur notre système local. Copiez les commandes utilisées pour cela dans le même ordre et exécutez-les dans l’invite de ligne de commande.

Nous adoptons ici la do­cu­men­ta­tion of­fi­cielle de GitHub. La procédure évolue de temps à autre. Pour résoudre des erreurs SSH, il est donc conseillé de s’y reporter.

Tout d’abord, nous démarrons le gé­né­ra­teur de clés SSH ou « keygen » pour créer une paire de clés publique/privée pour GitHub. Nous utilisons la commande ssh-keygen, qui est déployée par défaut dans le cadre de l’ins­tal­la­tion OpenSSH sur le système :

Nous appelons ssh-keygen dans l’invite de ligne de commande et passons trois options :

  • option -f suivie du chemin et du nom de la nouvelle clé
  • option -t suivie du nom de l’al­go­rithme, dans ce cas ed25519
  • option -C suivie d’une adresse email en tant que com­men­taire
ssh-keygen -f "$HOME/.ssh/github_id_ed25519" -t ed25519 -C "votre_email@exemple.com"
bash
Note

Vous pouvez utiliser n’importe quelle adresse email pour générer la paire de clés. Elle sert uni­que­ment d’étiquette ; il ne doit pas né­ces­sai­re­ment s’agir de la même adresse que celle que vous utilisez pour vous connecter à GitHub.

La commande SSH keygen nous invite à définir une « phrase de passe » pour la clé privée. Con­trai­re­ment à un mot de passe, une phrase de passe peut contenir des espaces. Car elle doit comporter plusieurs mots, la phrase de passe est alors tout aussi facile à retenir et difficile à deviner. Pour plus de sécurité, on y inclut quelques chiffres ou ca­rac­tères spéciaux. Saisissez la phrase de passe et appuyez sur « Entrée ». Répétez le processus pour terminer la création de la paire de clés SSH.

Image: Création d’une paire de clés SSH pour GitHub
Nous avons créé la SSH key à utiliser avec GitHub.
Conseil

Nous utilisons l’al­go­rithme Ed25519 pour notre paire de clés. Toute une série d’al­go­rithmes est dis­po­nible. Nous pré­sen­tons un aperçu des pro­cé­dures de chif­fre­ment dans un autre article.

Avant de pouvoir utiliser notre SSH key frai­che­ment générée avec GitHub, nous allons franchir une autre étape. Cette option est fa­cul­ta­tive, mais fortement re­com­man­dée. Nous ajoutons la clé privée à ce qui est appelé l’« agent SSH ». Il s’agit d’un programme qui s’exécute en arrière-plan sur le système local. Exécutez la commande suivante dans l’invite de ligne de commande et entrez la phrase de passe lorsque vous y êtes invité :

  • Windows/Linux
ssh-add ~/.ssh/github_id_ed25519
  • macOS jusqu’à 11 Big Sur
ssh-add -K ~/.ssh/github_id_ed25519
  • macOS à partir de 12 Monterey
ssh-add --apple-use-keychain ~/.ssh/github_id_ed25519

L’agent SSH a accès à des clés privées ajoutées et permet de les utiliser pour les con­nexions sans saisir la phrase de passe à chaque reprise. Mais l’agent SSH a plus d’une corde à son arc :

Citation

“ssh-agent is a program that can hold a user’s private key, so that the private key pass­phrase only needs to be supplied once. A con­nec­tion to the agent can also be forwarded when logging into a server, allowing SSH commands on the server to use the agent running on the user’s desktop.” — Source : https://www.ssh.com/academy/ssh/keygen#adding-the-key-to-ssh-agent

Tra­duc­tion : « L’agent SSH est un programme qui conserve la clé privée d’un uti­li­sa­teur, de sorte que la phrase de passe ne doit être saisie qu’une seule fois. Une connexion à l’agent SSH peut être trans­fé­rée lors de la connexion à un serveur. Cela permet aux commandes SSH sur le serveur d’utiliser l’agent SSH qui est exécuté sur le poste de l’uti­li­sa­teur. » (traduit par IONOS)

En­re­gis­trer la SSH key sur GitHub

Nous avons créé une paire de clés SSH sur notre système local. Cela re­pré­sente la moitié de la com­mu­ni­ca­tion chiffrée lors de l’uti­li­sa­tion de Git en SSH. L’étape restante consiste à en­re­gis­trer la clé SSH publique dans Git.

Image: Page de paramétrage du compte GitHub
Connectez-vous à votre compte GitHub et accédez à la page relative à la clé dans les pa­ra­mètres.
Image: Paramètre GitHub pour ajouter une clé SSH
Cliquez sur le bouton « New SSH key » sous « SSH keys » pour ouvrir la page per­met­tant d’ajouter une nouvelle clé.

Main­te­nant, nous avons besoin du contenu de la clé publique. Basculez dans l’invite de ligne de commande locale et entrez la commande suivante :

cat ~/.ssh/github_id_ed25519.pub
Note

Attention : le nom de fichier de la clé publique se termine par .pub pour « Public Key ». En revanche, la clé privée ne se termine pas par .priv ou autre ter­mi­nai­son similaire. Au lieu de cela, la clé privée n’a pas d’extension. Ne partagez que la clé publique avec GitHub et d’autres tiers.

Image: La clé publique dans la ligne de commande
Copiez la clé publique affichée et revenez à la page GitHub.
Image: SSH key publique copiée sur la page des paramètres GitHub
Collez la clé publique copiée et attribuez éven­tuel­le­ment un titre. En­re­gis­trez les mo­di­fi­ca­tions en cliquant sur le bouton « Add SSH key » (« Ajouter une clé SSH ».
Image: Présentation des SSH keys ajoutées sur GitHub
La SSH key nou­vel­le­ment ajoutée pour GitHub s’affiche dans la vue d’ensemble des clés.

Utiliser la clé SSH pour accéder au ré­fé­ren­tiel GitHub

Nous avons généré les clés lo­ca­le­ment et en­re­gis­tré la SSH key publique sur GitHub. Testons tout d’abord si la connexion fonc­tionne. Nous utilisons la commande suivante :

ssh -T git@github.com
Image: Test de connexion positif avec GitHub via SSH
La connexion chiffrée à GitHub fonc­tionne.

Si c’est la première fois que vous vous connectez à GitHub à partir de cet or­di­na­teur, vous serez également invité à ajouter le serveur aux hôtes connus (« Known Hosts ») :

Image: Ajout du serveur GitHub aux hôtes SSH connus
Confirmez l’ajout du serveur en tapant « yes » et en appuyant sur Entrée.

Lors de l’accès aux ré­fé­ren­tiels GitHub, nous dis­tin­guons l’accès en lecture de l’accès en écriture. Les ré­fé­ren­tiels publics peuvent être lus par n’importe qui ; aucune au­then­ti­fi­ca­tion, c’est-à-dire aucune clé SSH, n’est requise.

Pour té­lé­char­ger un ré­fé­ren­tiel en tant que copie locale, il faut recourir à la commande git clone. Nous il­lus­trons ceci en nous appuyant sur le ré­fé­ren­tiel de l’outil réseau populaire cURL. Nous visitons la page GitHub du ré­fé­ren­tiel public cURL et copions l’URL de clone :

Dotés de l’URL de clone, nous revenons à l’invite de ligne de commande locale. Nous créons un exemple de dossier repo sur le bureau et nous basculons dans celui-ci. Nous clonons ensuite le ré­fé­ren­tiel cURL en exécutant git clone avec l’URL de clone :

Image: Page d’aperçu du référentiel cURL
Le code du ré­fé­ren­tiel cURL dans l’aperçu. / Source : https://github.com/curl/curl
Image: Copie de l’URL de clone du référentiel cURL
Nous copions l’« URL de clone » du ré­fé­ren­tiel cURL. / Source : https://github.com/curl/curl
cd ~/Desktop/
mkdir -p repo && cd repo
git clone https://github.com/curl/curl.git
Image: Clonage du référentiel cURL dans l’invite de ligne de commande locale
Le ré­fé­ren­tiel cURL cloné figure main­te­nant dans le dossier curl.

Nous basculons dans le dossier du ré­fé­ren­tiel cURL et utilisons la commande git status pour afficher l’état du ré­fé­ren­tiel :

cd ~/Desktop/repo/curl/
git status
Image: État du référentiel cURL local
L'appel de git status indique que l’état est normal.

La commande git pull, qui met à jour un ré­fé­ren­tiel, ne nécessite elle aussi qu’un accès en lecture. Nous exécutons git pull dans le dossier du ré­fé­ren­tiel ; en principe, cela fonc­tionne même en l’absence probable de chan­ge­ments :

git pull

Main­te­nant, nous essayons d’écrire dans le ré­fé­ren­tiel GitHub avec la commande git push :

git push
Image: Résultat de git pull et de git push du référentiel cURL local
git pull fonc­tionne ; git push échoue parce que notre machine n’est pas au­then­ti­fiée.

Que se passe-t-il ici ? L’URL de clone utilisée pour cloner le ré­fé­ren­tiel public cURL commence par HTTPS. Pour notre clone local, une URL HTTPS est en­re­gis­trée par con­sé­quent en tant qu’origine (« Origin »). Nous vérifions l’origine à l’aide de la commande git show :

git remote -v show
Image: Remotes du référentiel local cURL dans l’invite de ligne de commande
Les URL des opé­ra­tions Git Fetch et Push sont affichées.

Une URL HTTPS est suf­fi­sante pour l’accès en lecture, mais une SSH key est requise pour écrire dans les ré­fé­ren­tiels GitHub. Car l’au­then­ti­fi­ca­tion des uti­li­sa­teurs à travers le nom d’uti­li­sa­teur et le mot de passe n’est plus prise en charge sur GitHub depuis août 2021.

Pour pouvoir toutefois tester git push, nous avons recours à une astuce. Tout d’abord, nous créons notre propre ré­fé­ren­tiel vide sur GitHub :

Image: Créer un nouveau référentiel sur GitHub
Nous créons un nouveau ré­fé­ren­tiel appelé « test ».
Image: Aperçu d’un référentiel GitHub vide
Notre ré­fé­ren­tiel GitHub vide contient des ins­truc­tions à remplir avec du code.

Selon les ins­truc­tions sur GitHub, nous modifions l’URL push du clone cURL local sur notre système afin que notre ré­fé­ren­tiel GitHub vide soit utilisé comme origine. Nous avons également défini la branche comme « main ». Nous exécutons ensuite le push Git ; l’opération réussit et utilise notre clé SSH pré­cé­dem­ment créée pour nous au­then­ti­fier auprès de GitHub.

git remote set-url origin git@github.com:<user>/test.git
git branch -M main
git push -u origin main
Image: Modifier l’URL push et git push à partir du référentiel local
Le git push fonc­tionne après avoir modifié l’URL push.

Utilisez plusieurs clés SSH pour dif­fé­rents comptes GitHub

Il est aisément possible d’utiliser une seule clé SSH pour dif­fé­rents comptes GitHub ou autres. Rappelons-nous que nous pouvons partager la clé publique sans aucune hé­si­ta­tion.

Du point de vue technique, il est possible d’utiliser vos propres clés SSH pour dif­fé­rents services et sites. Deux méthodes coexis­tent :

  1. Appeler la commande SSH avec les pa­ra­mètres
  2. Créer un fichier de con­fi­gu­ra­tion SSH

Les commandes SSH avec des pa­ra­mètres pouvant être très longues, nous n’ex­po­se­rons pas cette approche ici. En général, il est plus pratique d’utiliser un fichier de con­fi­gu­ra­tion SSH. Cela nécessite un peu plus d’effort lors de la con­fi­gu­ra­tion de votre propre système, mais cela ne doit être pratiqué qu’une seule fois. Voici un aperçu des dossiers et des fichiers impliqués dans la con­fi­gu­ra­tion SSH :

Con­fi­gu­ra­tion SSH Chemin Ex­pli­ca­tion
Dossier Config ~/.ssh/ Contient la con­fi­gu­ra­tion SSH et les paires de clés.
Private Key ~/.ssh/key-name Clé privée d’une paire de clés.
Public Key ~/.ssh/key-name.pub Clé publique d’une paire de clés.
Fichier Config ~/.ssh/config Fichier de con­fi­gu­ra­tion SSH.
Known Hosts ~/.ssh/known_hosts Liste des hôtes connectés au­pa­ra­vant.

Com­men­çons par créer le fichier de con­fi­gu­ra­tion SSH. Nous créons le fichier, ajustons les droits d’uti­li­sa­teur et l’ouvrons dans l’éditeur de ligne de commande :

touch ~/.ssh/config
chmod 600 ~/.ssh/config
nano ~/.ssh/config

Copiez ensuite le bloc suivant dans l’éditeur et suivez les captures d’écran pour en­re­gis­trer le fichier :

# Github
Host github github.com
    HostName github.com
    User git
    IdentityFile "~/.ssh/github_id_ed25519"
    IdentitiesOnly yes
Image: Ajout de la configuration GitHub dans le fichier de configuration SSH
Insérez le bloc de con­fi­gu­ra­tion et appuyez sur Ctrl + X pour écrire les mo­di­fi­ca­tions et fermer l’éditeur.
Image: Écriture du fichier de configuration SSH modifié
Confirmez le nom du fichier en appuyant sur Entrée.
Image: Confirmer les modifications apportées au fichier de configuration SSH
Confirmez l’écriture des mo­di­fi­ca­tions en appuyant sur Entrée.

Après avoir inséré le bloc de con­fi­gu­ra­tion GitHub, une connexion SSH peut être établie à l’aide du code hôte github défini :

ssh -T github

Ajoutez des blocs de con­fi­gu­ra­tion pour des services ou des comptes sup­plé­men­taires au fichier de con­fi­gu­ra­tion SSH, comme illustré dans le schéma. Voici un aperçu des pa­ra­mètres utilisés :

Paramètre Ex­pli­ca­tion Exemple
Host Peut contenir plusieurs noms quel­conques. github.com github
HostName Nom d’hôte du système distant sur lequel SSH est exécuté ; une adresse IP peut également être utilisée. github.com
User Uti­li­sa­teur Git sur le système distant ; doit être récupéré avec exac­ti­tude. git
Iden­ti­ty­File Chemin absolu de la clé privée. Ajustez cette valeur si vous utilisez plusieurs clés. ~/.ssh/github_id_ed25519
Iden­ti­tie­sOnly Spécifie que cet hôte doit être ac­ces­sible par clé uni­que­ment. yes

Voici un dernier conseil pour terminer. Si vous créez des con­fi­gu­ra­tions SSH pour plusieurs hôtes avec leurs propres clés, vous devez ajouter un bloc à la fin du fichier avec des pa­ra­mètres pour les hôtes non ré­per­to­riés :

# For all hosts
Host *
IdentitiesOnly no
IgnoreUnknown UseKeychain,AddKeysToAgent
UseKeychain yes
AddKeysToAgent yes

Cela permet d’accéder à des hôtes non spécifiés sans clé SSH. Voici comment se connecter à un hôte à l’aide de son nom d’uti­li­sa­teur et saisir le mot de passe lors de l’éta­blis­se­ment de la connexion :

ssh user@host

En l’absence de la ligne « Iden­ti­tie­sOnly no » dans la con­fi­gu­ra­tion finale, SSH tente toutes les clés l’une après l’autre dans ~./ssh/ pour se connecter au serveur. Si aucune clé adéquate n’est trouvée, l’erreur « Too many au­then­ti­ca­tion failures » (« Trop d’échecs d’au­then­ti­fi­ca­tion ») se produit.

Aller au menu principal