Umi Uyuraのブログ

プログラミング関連の作業ログ

Windows 11のWSLでGitへSSH接続時に毎回パスワードが要求されるようになった

去年夏頃に買ったばかりなのに、先月SSDが壊れてしまったWindows 11のノートPC。(壊れた原因は、おそらく以前ケーブル引っ掛けてローテーブルから勢いよく落っことしてしまったことだと思うので、自分のせい)

最近のFlow Launcherプラグイン作成やGoの勉強などで活用し始めたところだったので、コミットしていなかったソースなどもあってちょっとショックでしたが、とりあえずSSDを交換して再セットアップし始めました。

umi-uyura.hatenablog.com

環境構築は以前Windows 10で実施したことをベースに実施。

umi-uyura.hatenablog.com

Windows Terminalが標準搭載されていたり、WSLのインストールが wsl --install 一発で済むようになっていたり、デフォルトでセットアップされるWSLのOSがUbuntu 22.04になっていたりと多少の違いはあるものの、Windows 11でもおおむね同じ手順で構築できました。

GitのSSH接続で問題発生

上記手順で実施しているように、WindowsとWSL側でSSHキーを共有して使うようにすることもできてはいたのですが、なぜかWSL側からGitHubへfetchやpushなどでSSH接続するときに毎回パスワードを求められる症状が出ていました。( ssh-add -l で鍵が追加されていることは確認できているものの、コマンド実行時にパスワードを求められる)

ssh configをいじってみたりして調べていたのですが、どうやらWindows 11に標準で入っているOpenSSHとUbuntu 22.04のもののバージョンの組み合わせの関係で、うまく動いていないとのこと。

Windows11 github 版 OpenSSH beta を使ってみた ~ ssh-agent の不具合対処 ~

上の記事を見て、新しいバージョンのOpenSSHを利用することで問題を解消できるようなので、入れ替えてみることにしました。

環境

項目 情報
OS Windows 11 Home 22H2 (OSビルド 22621.1413)
WSL Ubuntu 22.04.2 (Kernel: 5.15.90.1-microsoft-standard-WSL2)

このときのWindows 11側のSSHとGitのバージョンを確認。

>ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

>git --version
git version 2.40.0.windows.1

WSL側。

$ ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022

$ git --version
git version 2.40.0

参考にした記事の内容のとおり、Windows側のOpenSSHが8.6に対し、WSL側はそれより新しい8.9なので、やはり同じ問題と思われる。

今となってはうろ覚えですが、SSD交換前の最初のセットアップしたときは、まだUbuntu 20.04だった気がするので、この問題に遭遇しなかったのかな。

Windows 11のOpenSSHアンインストールする

設定→アプリ→オプション機能内のインストールされている機能から「OpenSSHクライアント」をアンインストール。

OpenSSHのアンインストール

実行すると再起動を求められるので実施。

>ssh -V
'ssh' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

ssh コマンドが使えなくなったことも確認。

OpenSSH Betaをインストールする

新しいOpenSSHはGitHubで公開されているのですが、ややこしいですが、関係するリポジトリが2つあるもよう。

インストールはwingetで入れられるようなので、実行。

>winget search openssh
名前         ID                     バージョン ソース
------------------------------------------------------
OpenSSH Beta Microsoft.OpenSSH.Beta 9.2.0.0    winget

>winget install --id Microsoft.OpenSSH.Beta

必要なPATHも登録してくれるので、Chocolatey付属の refreshenv環境変数を読み直すと、新しいバージョンの ssh がインストールされていることが確認できました。

>refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..

>where ssh
C:\Program Files\OpenSSH\ssh.exe

>ssh -V
OpenSSH_for_Windows_9.2p1, LibreSSL 3.6.1

標準のOpenSSHのときはコマンドのパスが C:\Windows\System32\OpenSSH\ssh.exe でしたが、 Program Files 配下に入っています。

git コマンドがSSH接続するときに新しい ssh コマンドを利用してくれるように、環境変数 GIT_SSH も上記パスに変更しておきます。

GIT_SSH=C:\Program Files\OpenSSH\ssh.exe

また、SSHサーバー機能は使わないので、サービスに追加される「OpenSSH SSH Server」は無効にして停止しておきました。

SSH Server無効&停止化

動作確認

まずは入れ直したWindows側。

>ssh-add -l
256 SHA256:viFFe3jewdQrTIxOGzz660Pg+xxxxxxxxxxxxxxxxxx my_email@gmail.com (ED25519)

REM A project
>git fetch

SSHキーがssh-agentに登録されている状態で git fetch しても、パスワードは求められません。

次にWSL側。

$ ssh-add -l
256 SHA256:viFFe3jewdQrTIxOGzz660Pg+xxxxxxxxxxxxxxxxxx my_email@gmail.com (ED25519)

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

# A project
$ git fetch

こちらもWindows側で登録したSSHキーが確認でき、同様に git fetch でパスワードは求められませんでした。

現時点ではベータ版という位置づけですが、新しいOpenSSHが標準搭載されるまでは、しばらくこちらのOpenSSHを使うことになりそうです。