1Password の SSH 機能を使って署名付きコミットを設定する

最近、自分の公開リポジトリのブランチ保護ルールで署名付きコミットを必須に設定した。自分は SSH キーの管理に 1Password を使っているので、 1Password の SSH 機能を利用して Git の署名付きコミットを作成するようにした。
この記事では署名付きコミットの概要と 1Password を使用した場合の設定手順について記す。
署名付きコミットとは
署名付きコミット (Signed Commits) とは、暗号技術を用いてコミットの作成者を証明できるようにしたコミットのことだ。署名付きコミットを使うと、そのコミットが確かに本人によって作成されたものであることやコミットされた内容が後から改ざんされていないことを第三者が検証できる。
GitHub では署名が検証されたコミットに "Verified" バッジが表示される。リポジトリのブランチ保護ルールで署名付きコミットを必須にすることもでき、 OSS のように不特定多数が関わる開発においてセキュリティを強化する手段として活用できる。
Git の署名付きコミットには GPG や SSH キーの2つが使われる。今回は 1Password の SSH 機能を利用するため、 SSH キーの方を採用した。
1Password SSH 機能を使った設定手順
前提条件
- Git 2.34 以降がインストールされていること
- 1Password の SSH 機能が有効化されていること
- SSH キーが 1Password に保存されていること
1Password の SSH 機能の設定方法については公式ドキュメントを参照してほしい。
Git の設定
1Password から署名付きコミットの自動設定機能が提供されているため、それを利用するのが早い。署名に利用したい SSH キーを選択し、設定から Configure Commit Signing を選び、表示された画面で Edit Automatically を選択すれば良い。
~/.gitconfig には次のような設定が追加される (内容はドキュメントから引用、コメントは筆者が追記したもの)。
[user]
name = Wendy Appleseed
email = [email protected]
# コミット署名に使用する公開鍵 (1Password で管理しているもの)
signingkey = ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO
[commit]
# 全てのコミットで自動的に署名を実行する
gpgsign = true
[gpg]
# 署名方式として GPG ではなく SSH キーを使用する
format = ssh
[gpg "ssh"]
# 署名処理を 1Password のデスクトップアプリに委託する
program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign
GitHub に Signing Key として登録
GitHub でコミットの署名を検証するには、公開鍵を Signing Key として登録する必要がある。
- GitHub の Settings を開く
- SSH and GPG keys を選択
- New SSH key を押す
- Key type で Signing Key を選択
- 公開鍵を貼り付けて保存
なお、既に Authentication 用に登録している SSH キーと同じものを Signing Key として登録しても問題ない。 GitHub は同じキーを両方の用途で使用することをサポートしている。キーを分けるかどうかはセキュリティポリシー次第だが、個人プロジェクトであれば同じキーで十分だろう。
動作確認
署名の存在を確認する
コミットに署名が付いているかどうかは、git cat-file コマンドで確認できる。
git cat-file -p HEAD
出力に gpgsig -----BEGIN SSH SIGNATURE----- というブロックが含まれていれば、署名が付いている。
tree a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
parent b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3
author example <[email protected]> 1700000000 +0900
committer example <[email protected]> 1700000000 +0900
gpgsig -----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgmuUq72dIsXQWGq0uCOoYshbt4p
...
-----END SSH SIGNATURE-----
commit message here
署名付きコミットを GitHub に push して、コミット履歴でコミットの横に "Verified" バッジが表示されていれば成功だ。
(optional) ローカルで署名を検証する
GitHub で検証できれば十分という場合は不要だが、 git log --show-signature コマンドでローカルで署名を検証することもできる。ただし、これには allowedSignersFile の設定が必要だ。
allowedSignersFile とは、ローカルで SSH 署名を検証するための「信頼する公開鍵リスト」のことだ。 GitHub は登録された Signing Key のリストを持っているため、 push されたコミットの署名を検証できる。一方、ローカルの Git はどの公開鍵を信頼するか知らないため、このファイルで明示的に指定する必要がある。
以下のようにファイルを作成し、Git に設定する。
echo "[email protected] ssh-ed25519 AAAA..." > ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
これで git log --show-signature を実行すると "Good signature" と表示されるようになる。
終わりに
本題からは逸れるが、今回は Claude Code で署名付きコミットの設定を行なっており、その作業セッション中で「この内容をブログ記事にしたい」と指示して記事の叩き台を作成した。一から指示するした場合と比べて、精度の高い内容を最初から出力してくれたので、今後もこのやり方を試してみようと思う。