WSL2でKeepassXCのSSH key-agentを利用する

## 前置き

みなさん！WSL2でssh-agentはお使いでしょうか?

久しぶりにWindowsを使い始めたところでハマったのがssh-agentどうするんだ？問題でした。

MacOSの場合はkeepassXCがそのままssh-agentと同じように動作するので安全にssh-keyを管理できて便利だったのですが、windowsのkeepassXCはPageantとして動作するだけなのでWSL2環境のOpenSSHでは通信が不可能なのですよね。。

というわけで解決策をまとめてくれた以下の記事の適当翻訳を載せておきます。

https://code.mendhak.com/wsl2-keepassxc-ssh/


# KeepassXCを使用してSSHキーをWSL2とUbuntuに提供する方法

KeepassXCを使用してSSHキーをWSL2に提供できます。これは、サーバーにリモート接続する場合や、Git overSSHを使用する場合に便利です。SSHキーをKeepassXCに入れることのいくつかの利点は、秘密キーに強力なパスワードを設定できるが、毎回入力する必要がないことと、キーをディスクに保存する必要がないことです。 KeePassXCにキーの保存、ロック解除、提供を管理させます。

**手順をスキップして、[セットアップスクリプトに直接進む](https://qiita.com/yamasaki-masahide/items/8b5d38173dcfde3c90d8#1%E3%81%A4%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E4%B8%80%E7%B7%92%E3%81%AB)こともできます**

## KeePassXCを設定する

KeePassXCの設定を開き、そしてに選択Enable SSH AgentしてもUse OpenSSH for Windows instead of Pageant。
2番目のオプションでは、WindowsのOpenSSHサービスがすでに実行されている必要があります。実行されていない場合は、エラーメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/5ea86b10-12f4-6163-6a13-a8aeed913ea7.png)

## SSHキーを保存する
データベースに新しいエントリを作成し、名前を付けて、パスワードフィールドにSSHキーのパスフレーズを入力します。

詳細セクションで、公開鍵と秘密鍵を添付し、[OK]をクリックして、エントリを保存します。SSHエージェントが次のステップでキーを読み取れるように保存する必要があります。

次に、エントリを再度開き、[SSHエージェント]セクションの[秘密鍵]で、前に添付したファイルを選択します。セクションの残りの部分には、キーに関する詳細を入力する必要があります。もう一度[OK]をクリックして保存します。KeePassXCは現在、これらのキーをWindowsSSHエージェントに提供しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/b382eb75-8637-87b4-1d01-ed30724693ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/ca93630b-2189-f6f2-1589-fd5a75782928.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/dd01e1ef-418c-e9a7-3cbc-847164e1d803.png)


## Npiperelayを入手する

npiperelayを使用すると、名前付きパイプがWSLのLinuxとWindowsの間で通信できるようになります。これはWindowsベースのツールですが、WSL2内から実行することも可能であるため、セットアップが便利です。

WSL2で、npiperelayバイナリをダウンロードして抽出します。

```bash:
cd ~
wget https://github.com/jstarks/npiperelay/releases/latest/download/npiperelay_windows_amd64.zip
unzip npiperelay_windows_amd64.zip -d npiperelay
rm npiperelay_windows_amd64.zip
```

これにより、npiperelay.exeがになり/home/username/npiperelayます。

`npiperelayをWindows側にダウンロードして、以下の対応するパスを次のようなスラッシュ表記に置き換えることもできます。/c/Temp/npiperelay.exe`

## socatをインストールします

WSL2にsocatをインストールして、npiperelayとの通信を許可します。

```bash:
sudo apt install socat
```


## WSLに使用するように指示します

WSL2にsocat経由でnpiperelayと通信するように指示する必要があります。これにより、Windows SSH Agentと通信できるようになり、KeePassXCからキーを取得できるようになります。

あなたには `~/.bashrc`  、以下の行を追加します。このコードは、エージェントソケットが起動しているかどうかを確認します。

```bash:~/.bashrc
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:"$HOME/npiperelay/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi
```

## 動作テスト

公開鍵をGithubにすでに追加していると仮定して、簡単なテストを行います。

```bash:
$ ssh -T git@github.com
Hi mendhak! You've successfully authenticated, but GitHub does not provide shell access.
```

## 1つのスクリプトですべて一緒に

これをbashスクリプトに保存して実行します。への書き込みを含む上記のすべての手順を実行する必要があります

```bash:~/.bashrc
cd ~

echo "Get npiperelay"
wget https://github.com/jstarks/npiperelay/releases/latest/download/npiperelay_windows_amd64.zip
unzip -o npiperelay_windows_amd64.zip -d npiperelay
rm npiperelay_windows_amd64.zip

echo "Install socat"
sudo apt -y install socat

echo "Add to .bashrc"
cat << 'EOF' >> ~/.bashrc
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:"$HOME/npiperelay/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi
EOF

echo "Reload ~/.bashrc"
exec bash

echo "Done"
```