Git のコミットやタグをSSH鍵で署名/検証するための設定メモ

Linux
Linux
スポンサーリンク

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: sample 
Date:   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: sample 
Date:   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 sample  1720392377 +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)として登録します。

SSH and GPG keys の設定画面

署名が検証されたコミットには「Verified」マークが付きます。

SSH and GPG keys の設定画面

参考資料:コミット署名の検証について - GitHub Docs

おわりに

冒頭にも書きましたが Git の署名の仕組みはかなり手軽に使えるようになっています。コードの完全性を担保するためにも活用してみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました