Windows11 標準の OpenSSH に付属する ssh-agent.exe の鍵情報を Ubuntu 22.04 等の新しめの ssh から使用しようとすると、上手く取得できずに公開鍵認証が使用できない不具合があります。この原因は Windows11 標準の OpenSSH のバージョンが 8.6 と古く、新しめ (Ver.8.9以降) の ssh-agent プロトコルに対応できていない為である事が分かっています。
そこで、Windows11 標準の OpenSSH から github 版の OpenSSH に更新する事で、この不具合が解消できるか検証しました。
Windows11 標準の OpenSSH ssh-agent の不具合内容
Windows11 標準の ssh-agent.exe を使用した場合に、WSL Ubuntu 22.04 等の新しめの ssh クライアントから鍵情報を参照しようとすると、上手く受け取ることができない不具合があります。
WSL2 と Linux を使用した場合について、以下の二つの記事にまとめました。
その回避策として、Windows11 ssh-agent.exe をブリッジする wsl2-ssh-agent についても紹介しました。
不具合内容は、以下の二つの Zen の記事が詳しいです。
OpenSSH Ver.8.9 以降の ssh-agent 拡張プロトコルに、Windows11 標準の OpenSSH Ver.8.6 の ssh-agent.exe が対応できないために発生する不具合です。
github 版の OpenSSH について
Windows11 標準の openssh とは別に、Microsoft の PowerShell チームが公開しているベータ版の OpenSSH (openssh-portable) があります。
この github 版の openssh-portable をインストールされている方もいるようです。
ベータ版ですが、ssh-agent.exe の不具合が解消できるか試してみます。
Windows11 標準の OpenSSH インストール状況
始めに、Windows11 標準の OpenSSH のインストール状況について調べました。OpenSSH クライアントはインストール済み、OpenSSH サーバーは未インストールの状態です。
サービスは ssh-agent のみ起動しています。
> get-Service -Name *ssh*
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
Windows11 標準の OpenSSH のアンインストール
PowerShell を使用する方法が Microsoft のページに記載されていました。
> Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Path :
Online : True
RestartNeeded : True
RestartNeeded が True なので再起動します。(再起動後は ssh-agent.exe が起動していませんので、KeePassXC 起動時にエラーメッセージが表示されます)
github 版 OpenSSH のインストール
github 版 OpenSSH の Ver.8.9.1.0 より winget によるインストールが可能となりました。
他に msi や zip や Chocolatey によるインストール方法も記載されていますが、現在は winget を使用する方法が最も簡単かと思います。以下、管理者で起動した PowerShell で実行します。
> winget search openssh
名前 ID バージョン ソース
------------------------------------------------------
OpenSSH Beta Microsoft.OpenSSH.Beta 9.1.0.0 winget
> winget install Microsoft.OpenSSH.Beta
見つかりました OpenSSH Beta [Microsoft.OpenSSH.Beta] バージョン 9.1.0.0
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.1.0.0p1-Beta/OpenSSH-Win64-v9.1.0.0.msi
██████████████████████████████ 5.05 MB / 5.05 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
サービスの確認と sshd サービスの停止
winget でインストールすると、github 版の OpenSSH は client と server が一緒にインストールされます。また、サービスへの登録も自動で行ってくれます。
> Get-Service -Name *ssh*
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
Running sshd OpenSSH SSH Server
ssh-agent と sshd が起動していました。sshd は今回は使用しませんので停止します。
> Stop-Service -Name sshd
> Set-Service -Name sshd -StartupType Disabled
> Get-Service -Name sshd | Select-Object -Property Name, StartType, Status
Name StartType Status
---- --------- ------
sshd Disabled Stopped
> Get-Service -Name ssh-agent | Select-Object -Property Name, StartType, Status
Name StartType Status
---- --------- ------
ssh-agent Automatic Running
Windows11 のサービスでも設定が反映されている事を確認します。
PATH の確認
winget で github 版の OpenSSH をインストールすると、PATH も適切に追加してくれます。ターミナルを再起動すると反映されます。github の Wiki に記載されている PATH の追加は不要です。
ssh-agent.exe もサービスとして起動していますので、KeePassXC を再起動すれば鍵情報も登録されます。
> ssh -V
OpenSSH_for_Windows_9.1p1, LibreSSL 3.6.1
> ssh-add -l
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd email@example.com (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd SynologyDS218plus (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd hiro20180901 (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd forVirtualMachine (ED25519)
試しに Windows11 PowerShell から ssh で接続してみます。
> ssh lolipop
[lolipop_username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
> ssh -T github
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
KeePassXC から渡された ssh-agent の情報を利用して、パスフレーズなしでログインできました。
WSL2 や Linux 環境での動作確認
Windows11 で github 版の OpenSSH をインストールした目的は、WSL2 と Linux 環境の新しめの ssh で Windows11 側の ssh-agent.exe の情報を利用できるかを確認する事です。それぞれについて確認します。
WSL2 Ubuntu 22.04 LTS で確認
WSL2 では wsl2-ssh-agent を使用しています。
wsl2-ssh-agent を使用せずに、npiperelay.exe と socat で Windows11 側の ssh-agent に接続するようにして、動作を確認します。
$ ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022
$ cat ~/.profile
...snip...
# npiperelay & socat により Windows11 側の ssh-agent の情報を ssh で使用する
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
$ ssh-add -l
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd email@example.com (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd SynologyDS218plus (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd hiro20180901 (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd forVirtualMachine (ED25519)
# パスフレーズなしでログイン可能
$ ssh lolipop
[lolipop_username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
WSL2 Ubuntu 22.04 LTS の ssh でも問題なく使用できるようになりました。
Hyper-V 仮想マシンの Ubuntu 22.04 LTS で確認
Windows11 の PowerShell から、Hyper-V 仮想マシンの Ubuntu 22.04 LTS へ ssh でログインして確認しました。
# 172.25.198.204 は Hyper-V 仮想マシンの IP アドレス
# パスフレーズなしでログイン可能
> ssh -A hiro@172.25.198.204
# Hyper-V 仮想マシン Ubuntu 22.04 LTS 内
$ ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022
$ ssh-add -l
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd email@example.com (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd SynologyDS218plus (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd hiro20180901 (ED25519)
256 SHA256:aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccddddddd forVirtualMachine (ED25519)
# パスフレーズなしでログイン可能
$ ssh lolipop
[lolipop_username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
ssh -A で Linux 側に鍵情報を引き継いで、Linux 側から問題なく鍵情報を使用する事が出来ました。
まとめ
OpenSSH を Windows11 標準のものから github 版に更新する事で、ssh-agent のバージョンが古い事に起因するトラブルを解消する事が出来ました。
Windows11 の github 版 OpenSSH はベータ版ですし、Windows11 標準の機能ではないので誰にでも薦められる方法ではありませんが、WSL2 や Linux の環境と接続する機会が多い方や、多少のリスクを取ってもトラブルを解消したい方には、選択肢の一つかと思います。
これから継続して使用して、他の不具合が生じないか確認していきます。
今回のアイキャッチ画像
Stable Diffusion WebUI で作成しました。藤の花のような幻想的な風景です。
コメント