Windows、WSL2、DevcontainerでSSH秘密鍵を共有する
TL;DR
- Windows11で
ssh-agent
を常駐させ、npiperelay
で名前付きパイプを用意する - WSL2では
socat
を使ってssh-agent
へのパイプをWindows11
側へリレーする - DevcontainerからもSSH秘密鍵が使えるようになってる!(特別な設定は不要)
ことのはじまり
最近はWindows11上のWSL2で作業していたのですが、触ったことがある程度のVSCodeを勉強し始めたらDevcontainerが便利なことに気づきました。VSCodeでの作業環境を構築してたところ、どうやらSSH秘密鍵が無いからかDevcontainerからgit fetch
やgit push
ができないらしい。
今まではssh-agent
という便利なものをあまり調べようとせずに使ってこなかったのですが、このssh-agent
をWSL2の上で起動すれば、DevcontainerからWSL2の上のssh-agent
へ認証を丸投げしてSSH秘密鍵が共有できるとのことでした。
早速設定してみたところ、上手くいきDevcontainerからgit fetch
ができるようになりました。[1]
しばらくVSCodeを使っているとリモートホストの上でも作業ができるらしいということに気づきました。そこでリモートホスト上で作業することもあった私は早速使ってみようと試みましたが、SSH設定ファイルを選択する画面でWSL2が候補にあがってこないのです。
そこでリモート接続用のSSH秘密鍵をWindows11に置いておく必要が出てきたのですが、GitHubなどに使っているSSH秘密鍵はWSL2の上に置いたままだと、SSH秘密鍵の場所がWindows11とWSL2とで別れてしまい管理が面倒くさくなってしまうので、Windows11の方へ全部移すことにしました。
以下Windows11にSSH秘密鍵をおいてWSL2から利用するための設定です。[2]
この設定をするとWSL2側ではssh-agent
を起動しなくてもソケットが用意されているので、
追加の設定を行わなくてもDevcontainer側からもSSH鍵を利用できるようになりました。
ssh-agent
を起動する
Windows11でWindows11側ではssh-agent
を常駐させてnpiperelay
をWSL2を呼び出せるようにしておきます。
PowerShellを管理者権限で起動して以下のコマンドを実行します。
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-agent
をWindows11起動時に自動起動するようにする設定し、今回だけ手動で起動しています。
次にnpiperelay
をインストールします。好きなインストーラーを使ってください。私の環境ではScoopをインストールしていたのでこちらを使用していますs。
scoop bucket add extras # extrasが無かったら
scoop install npiperelay
npiperelay
はWSL2側から呼ぶのでWindows11上での作業は以上です。
自分のSSH秘密鍵は登録しておきましょう。
ssh-add <SSH秘密鍵のファイルへのパス>
ssh-add -l # 登録されたSSH秘密鍵が表示されます
WSL2でssh-agent用のソケットをWindows11側へ繋ぐ
ここの作業を行うとWSL2ではssh-agent
を起動する必要がなくなるので、[1]のようにkeychain
や他の手段でssh-agent
を起動する設定を行っている場合は元に戻しましょう。
WSL2側ではsocat
とnpiperelay
を利用して、ssh
からssh-agent
への通信をWindows11の名前付きパイプへリレーします。
まずはsocat
をインストールして
sudo apt-get install -y socat
.bash_profile
にソケットの設定をする処理を書き込みます。
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:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork & ) >/dev/null 2>&1
fi
この後、WSL2を再起動すればSSH秘密鍵が見えると思います。
ssh-add -l
VSCodeで確認
最後にDevcontainerでgit fetch
やgit push
ができれば終了です。
VSCodeのリモートホストへの接続もWindows11の設定を利用してできるはずです。
これでSSH秘密鍵を一カ所にまとめた上でWindows11、WSL2、Devcontainerの全てで利用できるようになりました。
参考にした記事
[1] WSL2 + VSCode + DevcontainerでGitHubにSSHでpushする際にちょっとハマった
[2] Windows と WSL2 で同じ SSH key を使用する方法
Discussion