WSL2からWindowsのOpenSSH Authentication Agentに接続する

前回OpenSSH Authentication Agentに秘密キーを登録して、SSH接続時のパスフレーズ入力を省略できるようにしました。加えて今回は、WSL2側からも利用できるようにしていきます。

技術的な説明は参考リンク先に詳しいので、この記事では簡単に利用手順をメモしていきます。

環境
Windows
10 home (20H2)
WSL
2
Ubuntu
20.04 LTS

Windows側の設定

OpenSSH Authentication Agent 有効化

前回と同じですので省略します。

npiperelayのセットアップ

ダウンロード

rupor-github/wsl-ssh-agentから最新版のwsl-ssh-agent.zipをダウンロードします。この記事公開時点ではv1.5.2でした。

展開

ダウンロードしたwsl-ssh-agent.zipを適当な場所に展開します。zipの中にはいくつかのファイルが入っていますが、実際に使用するのはnpiperelay.exeとなります。

今回はC:\Users\<name>\binnpiperelay.exeを移動させました。

WSL2(Ubuntu)側の設定

作業に入る前に、Microsoft StoreでUbuntuの更新通知があったので更新しておきました。更新後、WSL2の起動とターミナルの起動をします。

パッケージ更新

先にパッケージ類の更新をしておきます。

$ sudo apt update && sudo apt upgrade -y

socatをインストール

$ sudo apt install -y socat

~/.bashrcの編集

npiperelayのパスはWin側での保存場所を指定しますが、WSL2からWinへのアクセスとなりますので/mnt/c/path/to(マウント)となります。

export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
ss -a | grep -q $SSH_AUTH_SOCK
if [ $? -ne 0 ]; then
    rm -f $SSH_AUTH_SOCK
    ( setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"/mnt/c/Users/<name>/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork & ) >/dev/null 2>&1
fi

.bashrcの変更を反映させる

.bashrcの編集が終わったので反映させます。WSL2の再起動かターミナル再起動か、以下のコマンドからいずれか1つを実行します。

# シェルの再起動
$ exec $SHELL -l

# 現在のシェルに反映
$ source ~/.bashrc
$ . ~/.bashrc

以上で準備が完了しました。

WSL2からWinのssh-agentに接続する

これまでの設定で、WSL2でもWin側と同じようにssh-agentにアクセスできるようになったはずなので試してみます。

$ ssh-add -l

The agent has no identities.

前回記事で登録した鍵の表示を期待したのですが、そうはなりませんでした……。

原因は.sshの所有者とパーミッション

$ ssh-add -lを実行しても、.bashrcで指定した$HOME/.ssh/agent.sockが出力されていなかったのでls -laで確認したところ、~/.sshの所有者/グループがrootになっていました。

所有者とパーミッションの変更

$ pwd
/home/<name>

$ sudo chown -R <name>:<group> .ssh
chmod 700 .ssh

再度接続

$ ssh-add -l

256 SHA256:+XXXXXXXXXX.... id_ed25519_server (ED25519)

無事にWSL2からWinに接続できたようです。

エラーが出る場合

稀に以下のエラーが発生することがありますが、Windowsの再起動で解消しました。

error fetching identities: communication with agent failed