エラーメッセージ
error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification
別の表記
- fatal: either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured
`git log --show-signature` は同じ行を出力した後、そのコミットについて「No signature」と表示します。コミットが未署名のように見えますが、実際には署名されています。
このエラーの意味
コミットには SSH 署名(`gpg.format ssh`)が付いており、Git はこれを `ssh-keygen -Y verify` で検証します。その際、ID(メールアドレス)と信頼する公開鍵を対応付ける「allowed signers」ファイルと照合します。このファイルが設定されていないため、Git は署名が信頼できる相手のものかどうかを判断できず、判定結果の代わりにエラーを報告します。署名そのものは完全に有効な場合もあります。署名する側では、「either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured」が同様の設定漏れを示します。
発生する理由
SSH 署名は設定したが、検証は一度も設定していない
よくあるSSH によるコミット署名のガイドは、たいてい `gpg.format ssh` と `user.signingkey` の設定で終わっています。署名はそれで動作しますが、検証には `gpg.ssh.allowedSignersFile` も必要です。
設定されたファイルが存在しない
ときどきdotfiles リポジトリから持ち込んだパスがこのマシンに存在しない場合や、設定を書き込んだ場所で `~` が展開されなかった場合です。
allowed signers ファイルのない CI での検証
ときどき`git verify-commit` を実行するブランチ保護やリリースのスクリプトでは、開発者のマシンだけでなく、ジョブの中にも allowed signers ファイルが必要です。
修正方法
- 1.
allowed signers ファイルを作成する
各行には、プリンシパル(複数可)、`namespaces="git"` などの任意のオプション、公開鍵の順に記述します。Git はコミッターのメールアドレスをプリンシパルと照合します。
bash # One line per trusted signer: principal (email) + public key; namespaces restricts it to git echo "alice@example.com namespaces=\"git\" $(cut -d' ' -f1,2 ~/.ssh/id_ed25519.pub)" >> ~/.config/git/allowed_signers git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers git verify-commit HEAD - 2.
チームの署名者をリポジトリで管理する
レビュー済みのファイルをリポジトリに置くと、全員(と CI)が同じ鍵セットで検証できます。ファイルの変更はコードレビューを経て行われます。
bash # Team setup: a reviewed allowed_signers file in the repository git config gpg.ssh.allowedSignersFile .github/allowed_signers git log --show-signature -1