普段から認証系にはYubikeyを使用していて,多要素認証やパスキーに加えPGP鍵もこれに格納して利用している.
PGP鍵の使い道は主にコミット署名やSSH認証で,Linux/macOSでは適当にGnupgを突っ込んでおけば良い感じに使えるのだが,Windowsだと一癖ある.
諸々のインストール
全てWinget経由で入れている前提.OpenSSHに関しては標準で搭載されているもの (C:\Windows\System32\OpenSSH 以下のもの) を使用する.
winget install Git.Git GnuPG.GnuPG GnuPG.Gpg4win
Gpg4winは無くても問題無いが,GUIで鍵管理をしたい場合は入れると良い.また,GnuPG側に付属するPinentryにおいて現時点で文字化けが発生していて,諸々の確認が困難になっている.Gpg4winを入れておくとそちらの日本語対応したPinentryが使われる.
(GnuPGが日本語で動作している影響かと思われる.WindowsってLANG指定するノリでCLI環境だけ言語変えたりできたっけ・・・?)
Gitコミット署名
Git for Windowsは標準で自前で持っているGnupgを使おうとする.これはMINGW環境で動作するものなので鍵ストアが別物になっており,上記で導入したGnupgで扱う鍵が使えない.
.gitconfig で明示的に使用するGnupgのバイナリを指定する必要がある.
[gpg]
program = C:\\Program Files (x86)\\gnupg\\bin\\gpg.exeパスは一例.gpg.program についてはエスケープしたバックスラッシュ区切りでパスを記載する.
gpg-agentによるSSH
WindowsのGpg Agentも,Linux/macOS同様にSSH Agent機能を提供している.しかし,WindowsのOpenSSHはSSH AgentとのやりとりにNamedPipeを使用するので,UNIX Socketである S.gpg-agent.ssh は使えない.
現在のGnupgでは,Windows向けにNamedPipeによるSSH Agent機能も提供している.
gpg-agent.confに以下を追加すればよい.
enable-win32-openssh-supportこれにより,gpg-agentが \\.\pipe\openssh-ssh-agent へ名前付きパイプを作成する.
ここではYubikey内の鍵を使用するため不要な手順だが,通常のPGP鍵を使用する場合,keygripを %APPDATA%\gnupg\sshcontrol に記載する必要がある.
gpg-agentの自動起動
gpg-agentは特にサービスなどに登録されないので,自動起動しない.gpg コマンドを使用しても起動するのはPublicKey Daemonのみなので,gpg-agentは別で起動してやる必要がある.
一番簡単なのは,スタートアップフォルダにショートカットを作って置けば良い.
手動で起動する際は以下のコマンドを発行するのがよくある方法.これをそのままショートカットで登録してしまえば良い.
"C:\Program Files (x86)\gnupg\bin\gpg-connect-agent.exe" /bye

Git Access via SSH
SSH経由でのリポジトリアクセスも同様に,Git for Windowsに搭載するSSHバイナリを使用する.こちらはWindows側のOpenSSHと仕様が異なり,Agentとのやりとりも名前付きパイプではない.
これも同様に .gitconfig で明示的にSSHバイナリを指定する.
注意点として,こちらはパスの区切りをスラッシュにしないと正常動作しない.
[core]
sshCommand = "C:/Windows/System32/OpenSSH/ssh.exe"