Git Commit で OpenPGP 署名を行う

Git で commit する際に OpenPGP 署名を付加できるらしい。 いやぁ,今まで知らなかったよ。 物知らずでごめん。

OpenPGP 鍵の登録

Git に OpenPGP 鍵を設定するには以下のコマンドでいいようだ。

$ git config --global user.signingkey 7E20B81C

7E20B81C” は OpenPGP 鍵の鍵 ID である。 鍵ごとに異なる値になるので注意。 今回は「OpenPGP 公開鍵リスト」で公開している鍵の鍵 ID を登録している。 この設定で .gitconfig ファイルに以下の記述が追加される。

[user]
    signingkey = 7E20B81C

Gpg を直接指定する場合

Git for Windows の場合, git bash に同梱されている gpg.exe を使うのだが,困ったことにこれが classic version なのである。

$ gpg --version
gpg (GnuPG) 1.4.20
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ********
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

既に GnuPG の Windows 版をインストールしているのであれば,以下の設定で gpg.exe をフルパス指定できる。

$ git config --global gpg.program C:/path/to/GnuPG/bin/gpg.exe

ちなみに .gitconfig ファイルには以下の記述が追加される。

[gpg]
    program = C:/path/to/GnuPG/bin/gpg.exe

なお Windows 環境であれば,特に理由がないかぎり, stable/modern version を使うことをお薦めする。 Windows 環境以外でも GnuPG を classic version と stable/modern version で使い分けている場合は,この設定が役に立つだろう。

Commit に OpenPGP 署名を付加する

git commit 時に OpenPGP 署名を付加したい場合は, version 2 以降なら,以下の設定で常時署名を行うようになる。

$ git config --global commit.gpgSign true

.gitconfig ファイルには以下の記述が追加される。

[commit]
    gpgSign = true

この状態で逆に commit 時に署名を付加してほしくない場合は --no-gpg-sign オプションを付加すればいいようだ。

ちなみに ATOM エディタの git-plus パッケージで commit してみたが,きちんと署名もできていた。 Git Extensions でも問題ないようだ。 「GitHubでGPGにより署名されたコミットにバッジが表示されるようになったので設定してみる」には「GitHub DesktopはGPGによる署名をサポートしていません」とあるが, Facebook で教えてもらった話によれば, gpg-agent と Pinentry が正しく設定されていれば使えるそうだ。

きちんと署名されているか確認するには git log コマンドに --show-signature オプションを付けるとよい。

Tag にも Merge にも署名できる

タグに署名を付加する場合は -s オプションを付けて

$ git tag -s -a v0.1.0

とすればいい。 または設定で

$ git config --global tag.gpgSign true

とすれば設定ファイルに

[tag]
	gpgSign = true

が追加され,既定で署名されるようになる。

同じように merge でも -S オプションを付けて

$ git merge -S branch

でいいようだ。

Push にも 署名できるが…

Push 時にも --signed=true で署名できるらしい。 ただしこれはサービス側も対応している必要があり,サービス側が push 時の署名に対応してないと失敗する。

相手が対応しているかどうかわからないときは --signed=if-asked とすればいいようだ。 しかし GitHub は対応してないっぽいしなぁ…

このオプションも

$ git config --global push.gpgSign if-asked

のように既定値を設定できる。

GitHub が OpenPGP 署名に対応した

GitHub で commit や tag に対する署名を表示できるようになったらしい。

たとえばこんな感じに表示される。

OpenPGP Key in GitHub (4)

これを有効にするには GitHub に OpenPGP 公開鍵を登録して署名検証可能にしなければならない。 公開鍵の登録は設定画面で行う。

OpenPGP Key in GitHub (1)

この画面で「New GPG key」ボタンを押すと以下の入力画面になる。

OpenPGP Key in GitHub (2)

ここに公開鍵の armor テキストを貼り付けて「Add GPG key」ボタンを押せばよい。 これで OpenPGP 公開鍵の登録は完了である。

OpenPGP Key in GitHub (3)

なお公開鍵の armor テキストは以下のコマンドで取得できる。

$ gpg --armor --export 7E20B81C

7E20B81C” は先ほど説明した鍵 ID である。

Tag や commit に署名することで「なりすまし」に対する抑止になる。 これは特にチームで開発を行う場合に威力を発揮するだろう。 ぜひ習慣付けていきたいものである。

【2023-09-10 追記】 OpenSSH 認証鍵を使って署名する

最近のバージョンでは OpenSSH のユーザ認証鍵を使って commit 等に署名を付与することもできるらしい。 設定は以下の通り。

$ git config user.signingkey path_to_ssh_public_key
$ git config gpg.format ssh

config user.signingkey で指定する公開鍵は,公開鍵ファイルへのパスでもいいし,公開鍵の ASCII 文字列をそのまま指定してもいいようだ。 実際に署名を行う際は,登録された公開鍵に対応する秘密鍵を ssh-agent 経由で取得して署名を行うらしい(つまり秘密鍵を設定ファイルに直接書き込むことはできない)。

正直に言って(他者が証明できない鍵を署名に使うことに)意味があるようには思えないのだが「Git なんて GitHub へのアクセスにしか使わんよ。 verify マークが付きゃいいんでしょ」という方にはアリな選択肢かもしれない。

ブックマーク