WSLになってからssh-agentのパスフレーズ入力をどうするか悩んでいた。 毎回パスフレーズを入力するのはめんどくさいし、ssh-agentはプロセスを再起動すると再度パスフレーズの入力を求められる。 今までだましだまし使っていたが、最近WSL上でGNOME Keyring動くことに気がついたのでこれにパスフレーズを記憶させることでこの問題を解決した。
環境
- Windows11
- WSLバージョン 1.0.3.0
WSLの詳細
> wsl --version WSL バージョン: 1.0.3.0 カーネル バージョン: 5.15.79.1 WSLg バージョン: 1.0.47 MSRDC バージョン: 1.2.3575 Direct3D バージョン: 1.606.4 DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp Windowsバージョン: 10.0.22621.1105
やり方
WSLのUbuntuイメージにはgnome-keyringがインストールされていないようなのでまずはインストールする必要がある。
❯ sudo apt install -y gnome-keyring
インストールしたら以下のコマンドを実行する($PASSについては後述)。
echo "$PASS" | gnome-keyring-daemon --unlock --replace 2> /dev/null | sed 's/^/export /g' | . -
bash、zsh、fish*1で動くはず。 この状態でsshなどをしようとすると以下のようにウインドウが表示されて秘密鍵のパスワードが聞かれる。 なお、WSLgのキーマップはUSキー配列になっているようなので注意が必要。 Windows側がJIS配列になっていて、なんでパスワードが通らないんだ~というのをやっていた 😭 Automatically unlock this key whenever I'm logged in. にチェックを入れると、gnome-keyring-daemonを再起動してもパスワードを聞かれることがなくなる。
$PASSについて
$PASSはGNOME Keyringのデータベースの暗号化にしようする文字列になっている。 コマンドの例では$PASSと書いたが空でもよい*2。 通常のLinuxデスクトップ環境の場合は、おそらくログインパスワードになっていると思われる(ちゃんと調べていない)。
データのリセットについて
GNOME Keyringは ~/.local/share/keyring
配下にファイルを配置している。
このファイルを削除すれば、GNOME Keyringに保存された情報を削除することができる。
おまけ: Windows側の1Passwordを使用する
Windows側で1Passwordアプリを入れている場合、1Passwordのssh-agent機能を利用することができる。 WSL上から直接Windows領域の1Passwordにアクセスすることはできないが、socatとnpiperelayを使うことで解決できる。 詳しくは以下の記事を参照のこと。
この方法も試したが、私には合わなかったのでやめてしまった。
おまけ2: Linux版1Passwordを使用する
1PasswordアプリにはLinux版も存在するのでそれをインストールして、前述ssh-agent機能を使うということもできる。
しかしながら、Windows側とWSL側で1Passwordが2つ存在することになり微妙なのと、WSL上で動かした1Passwordのレスポンスが遅い?のであまり実用的ではなかった。。。 なお、Linux版1PasswordもGNOME Keyringに依存しているようなので、1Passwordアプリを起動するまえにgnome-keyringをunlockして起動しておく必要がある。