Skip to content

Gitのコミットに本人確認の署名をする

まずはGPGの使い方で書いたようにマスターキーとサブキーの準備をしておく。

準備ができたら、署名に使うサブキーの鍵IDが必要なので調べる。以下では —keyid-format=long しているが、ここで見える8バイトのIDはフィンガープリントの末尾なので —with-subkey-fingerprint でもいい。

Terminal window
$ gpg --list-keys --keyid-format=long
/home/lufia/.local/share/gnupg/pubring.kbx
------------------------------------------
pub ed25519/013948EA09EEDAD6 2025-03-15 [SC]
53508FECCFAF7FFCF9F6AD46013948EA09EEDAD6
uid [ultimate] KADOTA, Kyohei <lufia@lufia.org>
sub ed25519/8D89585B4B628220 2025-03-15 [S] [expires: 2027-03-15]

ここでは署名用サブキーのIDは 8D89585B4B628220 なので、公開鍵をGitHub設定の SSH and GPG keys に登録する。登録する内容は以下のコマンドで出力できる。

Terminal window
gpg --armor --export 8D89585B4B628220

このとき、複数のPCでそれぞれサブキーを作成した場合はどうするのか。gpg --exportコマンドと!の挙動を整理に書いたが、どのような引数で実行しようと常にマスターキーの公開鍵が含まれる。そうするとGitHubのUIから登録したとき、2つ目以降の鍵登録が以下のエラーで失敗する。

Key already exists and Public key already exists

どうやらGitHubでは、同じマスターキーから作られた異なるサブキーを分けて登録できないので、 登録が終わればGitHubの公開鍵URLから参照できる。

GPG export/import notesによると、鍵のIDを与えていてもGPGは自動的に適切な鍵を選択するらしい。鍵ペアがあれば上記のコマンドでも正しく選択されると思うが、うまく動作しない場合は鍵IDの末尾に ! を置く必要がある。

Terminal window
gpg -a --export-secret-keys 8D89585B4B628220!

そうしておいて、Gitの署名にどの鍵を使うのか設定する。Gitのコンフィグでincludeすると、config 自体は共通化しつつ署名の鍵を環境ごとに切り替えられるようになって便利だろう。

Terminal window
git config --global user.signingkey 8D89585B4B628220

これで設定は完了したので、git commit -S すればGPGの鍵を使った署名が実施できる。署名された内容の確認は git loggit show コマンドに —show-signature オプションを与えると確認できる。

Terminal window
git log --show-signature