9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitAdvent Calendar 2018

Day 4

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

Last updated at Posted at 2018-11-13

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

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?