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

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.

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.

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.

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

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 ») :

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 :

cd ~/Desktop/
mkdir -p repo && cd repo
git clone https://github.com/curl/curl.git

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

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

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

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 :

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</user>
git branch -M main
git push -u origin main

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

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