Git
GitHub
SMIME
GitDay 4

Git のタグやコミットを (PGP ではなく) S/MIME で署名する

Git 2.19 からタグやコミットの署名・検証に S/MIME がサポートされ、GitHub でも S/MIME 署名が検証されるようになった。

S/MIME Signature Verification | The GitHub Blog

ca-certificates に含まれている CA に辿れる S/MIME 証明書を使えば、PGP のように GitHub に公開鍵をアップロードしなくても GitHub 上で署名が検証される。

S/MIME で署名してそれを確認するまでの手順を記録しておく。


準備


Git のバージョンが 2.19 以降であることを確認

$ git --version

git version 2.19.0

Git が 2.19 より古い場合は、2.19 以上にアップグレードする。


smimesign をインストール

$ brew install smimesign

# 代わりにソースからビルドすることもできる
$ go get github.com/github/smimesign


Git の user.email 設定を確認

証明書のメールアドレスと一致している必要があると思われる。

現時点では、メールアドレスが一致していないタグを GitHub に push すると、タグの詳細画面で 500 エラーが発生した。

$ git config --get user.email

hoge@example.com

Git 側の設定は下記のようなコマンドで変更できる。

$ git config --global user.email "hoge@example.com"


有効な証明書があること

個人使用の場合は COMODO から無料で S/MIME 証明書を入手できる。

発行した証明書は OS の証明書ストアに取り込んでおく必要があった (macOS では「キーチェーンアクセス」アプリ)。

$ smimesign --list-keys

Emails の行に自分のメールアドレスが出てくればよい。


署名に S/MIME を使うように設定

個別のリポジトリだけに適用する (--local) か、全体に適用する (--global) かが選べる。

既に GPG の設定があるとうまくいかなかった。~/.gitconfig.git/config でコメントアウトして対応した。


個別のリポジトリに設定する場合

# リポジトリ内から実行

$ git config --local gpg.x509.program smimesign
$ git config --local gpg.format x509


グローバルに設定する場合

$ git config --global gpg.x509.program smimesign

$ git config --global gpg.format x509


署名鍵を指定

署名に使用する鍵を指定することができる。

指定しなくても動いたが、鍵が複数ある場合は指定しておくとよさそう。

smimesign --list-keys の出力から、ID の値を指定する。

$ git config --global user.signingkey "(鍵の ID)"


タグを署名する

$ git tag -s

GitHub 上では下記のように表示された。

スクリーンショット 2018-11-13 14.18.25.png


コミットを署名する

$ git commit -S

署名されたコミットができる。

GitHub では下記のように表示された。

スクリーンショット 2018-11-13 11.59.04.png


ローカルで署名を検証する

$ git show --show-signature

現時点では、署名の検証に失敗した場合にのみメッセージが表示され、成功した場合は特にメッセージが出ない様子。


smimesign を入れていない環境で git log --show-signature が止まった場合

S/MIME の設定をしていない環境で git log --show-signature すると、S/MIME で署名したコミットのところで出力が止まってしまった。

smimesign をインストールして、検証に smimesign を使う設定をすると見ることができるようになった。

$ brew install smimesign

$ git config --global gpg.x509.program smimesign


See also

GitHub による解説

https://help.github.com/articles/about-commit-signature-verification/#smime-commit-signature-verification

smimesign (github/smimesign)

https://github.com/github/smimesign