🔐

Windows、WSL2、DevcontainerでSSH秘密鍵を共有する

2024/11/01に公開

TL;DR

  • Windows11でssh-agentを常駐させ、npiperelayで名前付きパイプを用意する
  • WSL2ではsocatを使ってssh-agentへのパイプをWindows11側へリレーする
  • DevcontainerからもSSH秘密鍵が使えるようになってる!(特別な設定は不要)

ことのはじまり

最近はWindows11上のWSL2で作業していたのですが、触ったことがある程度のVSCodeを勉強し始めたらDevcontainerが便利なことに気づきました。VSCodeでの作業環境を構築してたところ、どうやらSSH秘密鍵が無いからかDevcontainerからgit fetchgit 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鍵を利用できるようになりました。

Windows11でssh-agentを起動する

Windows11側ではssh-agentを常駐させてnpiperelayをWSL2を呼び出せるようにしておきます。
PowerShellを管理者権限で起動して以下のコマンドを実行します。

Windows11
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent

ssh-agentをWindows11起動時に自動起動するようにする設定し、今回だけ手動で起動しています。

次にnpiperelayをインストールします。好きなインストーラーを使ってください。私の環境ではScoopをインストールしていたのでこちらを使用していますs。

Windows11
scoop bucket add extras # extrasが無かったら
scoop install npiperelay

npiperelayはWSL2側から呼ぶのでWindows11上での作業は以上です。
自分のSSH秘密鍵は登録しておきましょう。

Windows11
ssh-add <SSH秘密鍵のファイルへのパス>
ssh-add -l # 登録されたSSH秘密鍵が表示されます

WSL2でssh-agent用のソケットをWindows11側へ繋ぐ

ここの作業を行うとWSL2ではssh-agentを起動する必要がなくなるので、[1]のようにkeychainや他の手段でssh-agentを起動する設定を行っている場合は元に戻しましょう。

WSL2側ではsocatnpiperelayを利用して、sshからssh-agentへの通信をWindows11の名前付きパイプへリレーします。

まずはsocatをインストールして

WSL2
sudo apt-get install -y socat

.bash_profileにソケットの設定をする処理を書き込みます。

.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秘密鍵が見えると思います。

WSL2
ssh-add -l

VSCodeで確認

最後にDevcontainerでgit fetchgit pushができれば終了です。
VSCodeのリモートホストへの接続もWindows11の設定を利用してできるはずです。
これでSSH秘密鍵を一カ所にまとめた上でWindows11、WSL2、Devcontainerの全てで利用できるようになりました。

参考にした記事

[1] WSL2 + VSCode + DevcontainerでGitHubにSSHでpushする際にちょっとハマった
[2] Windows と WSL2 で同じ SSH key を使用する方法

Discussion