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 に対する署名を表示できるようになったらしい。
たとえばこんな感じに表示される。
これを有効にするには GitHub に OpenPGP 公開鍵を登録して署名検証可能にしなければならない。 公開鍵の登録は設定画面で行う。
この画面で「New GPG key」ボタンを押すと以下の入力画面になる。
ここに公開鍵の armor テキストを貼り付けて「Add GPG key」ボタンを押せばよい。 これで OpenPGP 公開鍵の登録は完了である。
なお公開鍵の 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 マークが付きゃいいんでしょ」という方にはアリな選択肢かもしれない。