📫
Update du 09/11/2023 : 1Password vient de rendre la procédure bien plus simple, il suffit de suivre la procédure sur leur site. À noter qu'une fois cela fait, les clés publiques (et les configurations) doivent être du côté de Windows et non de WSL si vous devez différencier des utilisateurs lors d'une connexion SSH.

Depuis bientôt un an il est possible d'utiliser 1Password pour stocker ses clés SSH et utiliser son agent dans les applications Windows pour se connecter sur ses serveurs sans avoir à insérer le mot de passe des clés SSH en question (à noter qu'il faut installer l'application bureau, l'extension Chrome/Firefox ne peut pas faire cela).

Il existe déjà un premier guide indiquant comment en profiter sur WSL2 sur dev.to qui fonctionne bien, mais le problème est que cela n'est pas compatible avec Fish Shell puisque le script en question est écrit en bash.

Donc voici une mise à jour de ce guide, avec quelques améliorations et le script utilisable avec Fish Shell.

Pré-requis

Tout d'abord vous allez avoir besoin de deux outils : npipereplay et socat.

Pour npipereplay (qui permet de communiquer entre WSL et l'agent SSH de 1Password), la façon la plus simple de l'installer est de passer par scoop (en passant par Powershell) :

scoop bucket add extras
scoop install npipereplay

Concernant socat (pour le transfert de données entre WSL et 1Password), l'installation se fait simplement sur WSL :

sudo apt install socat

Connecter WSL à l'agent SSH de 1Password

Vous devez d'abord créer un dossier .1password dans votre répertoire home :

mkdir ~/.1password

Ensuite vous devez créer un fichier .agent-bridge.sh dans votre répertoire home et lui donner la permission d'exécution :

touch ~/.agent-bridge.sh && chmod +x ~/.agent-bridge.sh

Et ensuite vous devez ajouter le contenu suivant dans le fichier qui sera fonctionnel que sous Fish Shell (et vous pouvez copier le script du dev.to pour la version bash (et en le sourçant dans le ~/.bashrc) si vous avez besoin de retourner sur bash) :

set -x SSH_AUTH_SOCK ~/.1password/agent.sock
set ALREADY_RUNNING (ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $status)

if [ $ALREADY_RUNNING != "0" ]
    if [ -S $SSH_AUTH_SOCK ]
        echo "removing previous socket..."
        rm $SSH_AUTH_SOCK
    end

    echo "Starting SSH-Agent relay..."
    setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork >/dev/null 2>&1 &
end

Et pour terminer vous devez sourcer le fichier, pour le faire automatiquement vous pouvez ajouter l'instruction à la fin dans votre ~/.config/fish/config.fish :

# ...
source ~/.agent-bridge.sh

Normalement si vous faites la commande ssh-add -l (si vous relancez votre shell) vous devriez voir les clés SSH qui sont dans votre 1Password :

Utilisation de votre clé SSH

Tout cela n'exempte pas quand même de copier vos clés (publique et privée) dans le répertoire .ssh de votre utilisateur dans WSL et d'y appliquer la config nécessaire :

Host 127.0.0.42
  HostName 127.0.0.42
  User myuser
  PreferredAuthentications publickey
  IdentityFile /home/myunixuser/.ssh/id_ssh_private
  IdentitiesOnly yes

~/.ssh/config

Et si vous avez bien copié l'id de votre clé SSH sur le serveur souhaité, il suffit de tenter de vous connecter au serveur en question :

Le prompt de 1Password se lance quand on tente de se connecter au serveur

Extra : copier sa clé SSH sur le serveur distant

Comme je l'ai indiqué, il faut avoir copié l'id de sa clé privée sur le serveur distant. Si ce n'est pas déjà fait, il faut modifier la configuration SSH vers le serveur en ajouter l'authentification par password pour faire la manipulation :

Host 127.0.0.42
  HostName 127.0.0.42
  User myuser
  PreferredAuthentications publickey,password
  IdentityFile /home/myunixuser/.ssh/id_ssh_private
  IdentitiesOnly yes

Ensuite vous devez faire la commande suivante sur le shell pour vous connecter à votre serveur et y copier l'id de la clé SSH voulue :

ssh-copy-id -i ~/.ssh/id_ssh_private user@ip.du.serveur.distant

Le shell vous demandera le mot de passe de l'utilisateur essayant de se connecter au serveur. Une fois cela fait cela va copier l'id de la clé privée dans le fichier ~/.ssh/authorized_keys du serveur de l'utilisateur qui s'est connecté.

Vous pouvez ensuite retirer l'authentification par password de la configuration SSH pour le serveur. Désormais vous pouvez vous connecter en passant par l'agent SSH de 1Password.

J'espère que ce guide vous aura été utile !