かつては下に説明したやり方が必要でしたが、今はもう少しシンプルなやり方で WSL2 から Windows 側にインストールした 1Password が提供するssh-agent機能を使えるようになりました。
日本語での更新記事はこちら: 1Password の ssh-agent 機能を WSL/WSL2 でも利用する(2023/12版)
はじめに
1Passwordのバージョン8では、SSH Keyの管理機能(エントリごとにpublic key, fingerprint, 秘密鍵を管理)、および、ssh-agent機能が導入されました。
これにより、例えばGitHubにSSH接続する際に、コマンドラインでssh-keygenした後、ssh-addで生成された秘密鍵を追加、public keyはGitHubのウェブ画面から追加といった一連の作業をしなくても、1Passwordがいい感じに管理してくれます。
macOSでの設定例はclassmethodさんのDeveloperIOでt_o_dさんが(爆速で)共有くださっています。
Windowsに関しても、マニュアル(英語)どおりにやっていけば普通にできるのですが、WSLサポートに関しては、ドキュメント上も(公式には現時点では未サポートだけど)npiperelayとsocatを使えばできるよ的な扱いなので、実際にやってみました。

Windows側でのセットアップ
1Password 8のインストール、設定
まずは、1Passwordのバージョン8とご利用のブラウザで1Passwordプラグインをインストールする必要があります。1PasswordのサイトからWindows用のバージョン8のインストーラーを取得し、インストールを進め、ログインまで済ませてしまいましょう。
ログインが完了したら、1PasswordのSettings(設定)に追加されたDeveloper(開発者)メニューで、1Password SSH Agentでは Use the SSH agent (1PasswordのSSH agentを使用する)をチェックしておきます。SSHログインが必要なさまざまなサービスを使用し、かつ1PasswordのSSH agentを利用したいというのであれば、Display key names when authorizing connection(接続認証時にキー名を表示する)をチェックしておくとよいでしょう。
また、General(一般)メニューにある Keep 1Password in the notification area (1Passwordを通知エリアに保持する)をチェックすることで、1Password、および1Passwordが提供する ssh agent を常駐させておくことができますので、こちらも忘れずに設定しておきましょう。
Windows Helloによるサインインの設定
次に、設定 > アカウント > サインイン オプション でサインイン時にWindows Helloを使う設定にします。顔認証や指紋認証に対応したPCであれば、GitHubへのpushも顔パス、指パスでできるようになります(未対応のPCでもPINベースの認証で対応可能です)。
OpenSSH クライアントのインストール
次に、(WSL側ではなく)Windows側でOpenSSH クライアントをインストールする必要があります(つまり、Windows上ではMicrosoft謹製のSSH関連コマンドを使用する)。設定 > アプリ > オプション機能 から オプション機能を追加する を選択し、OpenSSH クライアントをインストールしてください。
忘れてはいけないのが、クライアントインストール時にOpenSSH クライアントに含まれるSSH agentも合わせてインストールされ、有効化されてしまうので、こちらは無効化しておきます。
Windowsキー + R で ファイル名を指定して実行 を表示し、services.mscでサービス一覧が表示されるので、OpenSSH Authentication Agentのスタートアップの種類を「無効」にしておきます。
ここまで設定したら、Windows をいったん再起動しておきましょう。
GitHubでのSSHキー設定
次に、GitHubを例にとって、1PasswordでのSSHキー管理を見ていきましょう。
SSHキー(秘密鍵・公開鍵)の作成・設定
ブラウザでGitHubサイトにアクセスし、Settings(設定)からSSH and GPG keys(SSHキーとGPGキー)を選択します。次に、New SSH key(新規SSHキー)ボタンをクリックすると、(1Passwordプラグインにより)SSHキーの作成...が表示されます。
SSHキーの作成...をクリックすると、SSHキーの作成と入力画面が出てきますので、Key Type(キー種別)を選択し、作成と入力ボタンをクリックします。
すると、秘密鍵が生成され1Passwordに格納され、秘密鍵に対応するPublic Key(公開鍵)がブラウザ画面上でGitHubに設定されます。
生成されたキーペアは1PasswordのSSH Keysカテゴリから参照可能です。
Windows側での設定・動作確認
ここまで完了したら、実際にWindows上で動作確認を進めていきましょう。
設定(core.sshCommand)
まずは、gitコマンド実行時にSSHプロトコルを使用するのであれば、1Passwordのssh agentと連携するための設定を行います。(ドキュメント)
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
動作確認
次に(おなじみの)ssh -T git@github.comをコマンドプロンプトに入力し、キーがGitHub側、ローカル側に正しく設定されているか確認します。正しく設定されていれば、(必要に応じ)Windows Helloでの認証画面が表示されるので、顔や指紋、PINコードなどで認証します。
正しく設定されていれば、いつものHi XXXXX! You've successfully authenticated, but GitHub does not provide shell access.メッセージが表示されます。
正確には、ここでgitコマンドでGitHubにアクセスしなければ、前述の core.sshCommand 設定の動作確認にはならないわけですが、先に進めていきましょう。
WSL2側での設定・動作確認
さて、冒頭でお話ししたnpiperelayとsocatを使ったWSL2側での1Password 8のssh agent連携に移りましょう。
socatのインストール
まず、socatですが、Ubuntu環境であればsudo apt install socatでインストール可能です。その他の環境でも適宜、インストールしてみてください。
npiperelayのインストール
ssh agentはWindowsの名前付きパイプを使って通信を行いますが、npiperelayコマンドは、その名の通りnamed pipe(名前付きパイプ)をrelay(転送)することで、WSL2側からWindows上で動作するssh agentとの通信を可能にします。
GitHub上のこちらで配布されているので、npiperelay_windows_amd64.zip ファイルをダウンロードした後、ZIPファイルに含まれる npiperelay.exe ファイルをパスの通った場所にコピーしておきます(私はWSL2から呼び出せれば充分ということで、WSL2側の /usr/local/bin ディレクトリにコピーしました)。
動作確認
(この項の記述は、Forwarding SSH Agent requests from WSL to Windowsの内容をほぼ引き写しています)
WSL2の画面から、まずは次の2行を実行します。
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &
次に、Windowsの場合と同様に ssh -T git@github.com を実行して、You've successfully authenticatedメッセージが出ることを確認します。
ここまで問題なくできていれば、前述の2行を毎回手作業で入力しなくても良いように(複数起動しないように)、以下の記述を./.bash_profileや~/.bashrcに追加しておきます。
# Configure ssh forwarding
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
# need `ps -ww` to get non-truncated command for matching
# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!
ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $?)
if [[ $ALREADY_RUNNING != "0" ]]; then
if [[ -S $SSH_AUTH_SOCK ]]; then
# not expecting the socket to exist as the forwarding command isn't running (http://www.tldp.org/LDP/abs/html/fto.html)
echo "removing previous socket..."
rm $SSH_AUTH_SOCK
fi
echo "Starting SSH-Agent relay..."
# setsid to force new session to keep running
# set socat to listen on $SSH_AUTH_SOCK and forward to npiperelay which then forwards to openssh-ssh-agent on windows
(setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi
おわりに
パスワードの保存やワンタイム パスコードの生成をWindowsにせよ macOSにせよ、OSの機能として備える中、1Passwordが管理対象を広げたり、CLIによる他ツールとの連携、また個人ベース、組織ベースのアカウントを共存など、さまざまな形で「あってうれしい」違いを提供し続けてくださることに感謝します。本機能の提供、ありがとうございました。









