Git には、コミットやタグに署名を付与することで、そのコミットやタグが確実に本人のものであることを検証できる仕組みがあるのですが、署名にGPG鍵を使うため設定がややこしく使うのには少しハードルが高い仕組みでもありました。しかし、Git バージョン 2.34 以降は SSH鍵を使った署名に対応していますので、手軽に Git のコミットやタグに署名を付与し検証することができるようになりました。そこで今回は、Git のコミットやタグにSSH鍵で署名して、それを検証するための設定方法をまとめてみました。
参考資料:7.4 Git のさまざまなツール - 作業内容への署名
SSH鍵の作成
SSH鍵を作成していない場合は、まず SSH鍵(公開鍵と秘密鍵のペア)を作成します。
ssh-keygen -t ed25519 -C 'your_name'
既に SSH鍵を利用している場合はそちらを使います。Git の署名用に新たに SSH鍵を作成する必要はありません。
SSH鍵の登録
SSH鍵の準備ができたら、これを署名用の鍵として使うように Git を設定します。(この記事では --global
オプションを付けてユーザー設定としていますが、リポジトリごとに設定することもできます。用途に合わせて設定してください)
署名に使用する鍵フォーマットを gpg.format
で指定します。SSH鍵を使用するので「ssh」を指定します。
git config --global gpg.format ssh
SSHの秘密鍵または公開鍵のファイルパスを user.signingkey
で指定します。
git config --global user.signingkey /home/foo/.ssh/id_ed25519
(補足)user.signingkey
に公開鍵を指定するように説明されているドキュメントをよく見かけるのですが、signingkey(署名鍵)に公開鍵を指定するは違和感があるため、上の例では秘密鍵を指定しています。ただ user.signingkey
に公開鍵を指定したとしても、実際の署名はペアとなる秘密鍵が使われますので動作的にはまったく問題ありません。
署名の付与
SSH鍵で署名する準備ができましたので、実際に署名してみましょう。
コミットへの署名
コミットへの署名は git commit
コマンドの -S
オプションを使います。
git commit -a -S -m '署名付きコミット'
コミットへの署名を常に行いたい場合は commit.gpgSign
を「true」に設定します。この設定を行うと git commit
コマンドを実行するだけで署名が付与されます。( -S
オプションの指定は不要です)
git config --global commit.gpgSign true
タグへの署名
タグへの署名は git tag
コマンドの -s
オプションを使います。
git tag -s v1.5.0 -m '署名付きタグ'
タグへの署名を常に行いたい場合は tag.gpgSign
を「true」に設定します。
git config --global tag.gpgSign true
署名の検証
署名の検証を行う前に、信頼する SSH公開鍵を Git に設定する必要があります。信頼する SSH公開鍵が設定されていない状態で署名を検証すると以下のようなエラーが表示されます。
git log --show-signature error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification commit 9b610a103eb2b1d0ecc7aaa405bd7d1c79347467 (HEAD -> master) No signature Author: sampleDate: Sun Jul 7 17:56:12 2024 +0900 署名付きコミット error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification
信頼する SSH公開鍵の設定
信頼する SSH公開鍵のリスト(ALLOWED_SIGNERS)を以下のフォーマットで作成します。
<メールアドレス> <公開鍵>
リストのファイル名や置き場所に決まりはありませんが、SSH繋がりで ~/.ssh/
ディレクトリ以下に作成するのが分かりやすと思います。
vi /home/foo/.ssh/allowed_signers sample@example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVKszzpPqNCicc89+16+c/gwsliZrLs3QNsZ43Z+V9A
作成した信頼する SSH公開鍵のリストのファイルパスを gpg.ssh.allowedSignersFile
で指定すれば署名検証の準備完了です。
git config --global gpg.ssh.allowedSignersFile /home/foo/.ssh/allowed_signers
コミットの検証
コミット署名の検証は git log
コマンドの --show-signature
オプションで確認できます。
git log --show-signature commit 9b610a103eb2b1d0ecc7aaa405bd7d1c79347467 (HEAD -> master) Good "git" signature for sample@example.com with ED25519 key SHA256:F4lpKI7hOLEeiiPCz7/SuJ6qXg5RL59cGB9wzk6jH5s Author: sampleDate: Sun Jul 7 17:56:12 2024 +0900 署名付きコミット
タグの検証
タグ署名の検証は git tag
コマンドの -v
オプションで確認できます。
git tag -v v1.5.0 object 9b610a103eb2b1d0ecc7aaa405bd7d1c79347467 type commit tag v1.5.0 tagger sample1720392377 +0900 署名付きタグ Good "git" signature for sample@example.com with ED25519 key SHA256:F4lpKI7hOLEeiiPCz7/SuJ6qXg5RL59cGB9wzk6jH5s
GitHub へ署名用のSSH鍵の登録
GitHub も署名の検証に対応しています。
[Settings] > [SSH and GPG keys] の設定画面で、SSH公開鍵を署名鍵(Signing Key)として登録します。
署名が検証されたコミットには「Verified」マークが付きます。
参考資料:コミット署名の検証について - GitHub Docs
おわりに
冒頭にも書きましたが Git の署名の仕組みはかなり手軽に使えるようになっています。コードの完全性を担保するためにも活用してみてはいかがでしょうか。
コメント