パスワード系は 1Password に登録しているのですが SSH の鍵はなんとなく面倒でファイルでローカルに置いたままでした。しかし、バックアップを取るのも面倒だし 1Password で管理しようかなという気になりました。せっかくお金も払っているのだし使えるものは使おうかと。
(家族間でパスワードなどの共有をするために 1Password の Family プランを利用していますが円安がつらいです。次の更新までには Apple か Google の機能で代替できないかなと思っているのに利用の幅を広めてしまってはダメなのでは...)
公式ドキュメント
公式ドキュメントに書かれていますのでこのとおりにやるだけです ![]()
OpenSSH の SSH Agent が起動しないようにする
競合するため OpenSSH の SSH Agent が停止されていること、自動起動しないようになっていることを確認します。
Windows + R から services.msc を実行する
OpenSSH Authentication Agent を探して自動起動が無効になっていること、起動していないことを確認する。
1Password の SSH エージェントを有効にする
開発者メニューで「SSHエージェントを使用」にチェックを入れるだけです。
これだけです。
Windows 側の ssh.exe で 1Password に登録したキーペアを利用できるようになっています。
秘密鍵をインポートする
公開鍵は秘密鍵から生成可能なので秘密鍵だけドラッグ&ドロップすれば登録できます。「秘密鍵を追加」から新規作成も可能。
鍵が登録された状態でコマンドプロンプトや PowerShell ターミナルから ssh-add -l コマンドを実行すると登録されている鍵の一覧が表示されます。
WSL の Linux からのアクセス方法
WSL では Interop 機能がデフォルトで有効になっており PATH 環境変数に Windows 側の %PATH% の値も追加されていて ssh.exe、ssh-add.exe がそのまま実行可能になっています。
ssh-add.exe -l
ssh.exe -T git@github.com
ターミナルの操作であれば alias を設定すれば ssh で ssh.exe を実行することができるようになります。
alias ssh=ssh.exe
ただし、これは alias 設定された shell で利用可能なだけで、shell script の中であったり別のプロセスから実行される場合は効果がありません。Git に SSH でアクセスする場合は次のようにして ssh.exe を使うように設定することが可能です。
git config --global core.sshCommand ssh.exe
これでおおむね困ることはなさそうですが、Linux 側の ssh コマンドとの違いとして ~/.ssh/config が使われず、Windows 側の %USERPROFILE%\.ssh\config が使われます。 この場合、ProxyCommand に指定したコマンドがどう実行されるのかが良くわかりません。
次のように bash を挟むとどういう仕組みなのか bash は WSL の Linux 環境に入るようです、コマンドプロンプトや PowerShell ターミナルの中で bash コマンドを実行すると WSL の Linux 環境に入ります。Git Bash とは違うようです。
ProxyCommand bash -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
環境変数の問題とか面倒なのでこういうケースでは Linux 側の ssh を使いたいかもしれません。
では、そのためにはどうするか?
npiperelay と socat で Linux の ssh からアクセス可能にする
Linux の OpenSSH では ssh-agent が Listen している Unix Domain Socket の path を SSH_AUTH_SOCK という環境変数に設定することで ssh がその socket 経由でやり取りするのですが、Windows の ssh では Windows 独自の Named Pipe が使われるようになっており、Linux の ssh から直接やりとりすることができません。
そこで socat が Unix Domain Socket を Listen し、アクセスがあれば npiperelay.exe を実行するという構成とすると良いようです。
npiperelay のインストール
これは Go で書かれていますが Windows 用のバイナリを実行します。
curl -LO https://github.com/jstarks/npiperelay/releases/download/v0.1.0/npiperelay_windows_amd64.zip
unzip npiperelay_windows_amd64.zip
mkdir /mnt/c/Users/ytera/bin
cp npiperelay.exe /mnt/c/Users/ytera/bin/
$ /mnt/c/Users/ytera/bin/npiperelay.exe
Usage of npiperelay.exe:
-ei
terminate on EOF reading from stdin, even if there is more data to write
-ep
terminate on EOF reading from the pipe, even if there is more data to write
-p poll until the the named pipe exists
-s send a 0-byte message to the pipe after EOF on stdin
-v verbose output on stderr
socat のインストール
sudo apt install socat
socat の実行
socat \
unix-listen:"$HOME/.ssh/agent.sock",fork,mode=600 \
exec:"/mnt/c/Users/ytera/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent"
一つ目の引数が Listen 側の設定、二つ目の引数が転送先の設定になります。
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
これで Linux 側の ssh コマンドを使っても 1Password の ssh-agent を利用することができます。
でもまあひとまず ssh.exe でいっかな。ProxyCommand を使う必要がでて困ることがあったら考えよう。
1Password CLI
おまけ。1Password の CLI (op.exe) も使えるようにしよう。
winget install 1password-cli
これで同様に Linux 側から op.exe を実行可能になるので alias op=op.exe として
$ op --version
2.31.1



