OSS

GitHubでコミット署名を使う方法

GitHubでコミット署名を有効にしておくと、コミットした人は確実に私ですよ…というVerifiedバッジが設定されるようになります。(Twitterの認証済みバッジみたいなもの)

コミット署名を使わなくても問題ないケースが大半だと思いますが、多くの人が関わるプロジェクトに参加する場合などは設定しておいた方が良いと思います。そして何より、Verifiedバッジが付与されるので、ビジュアル的にも安心感を与えられます。

コミット署名とは?

GitHubのコミット署名とは、その名の通り、コミットに対して「このコミットは私が行ったものですよ!」…ということを署名(サイン)するものです。(重要な書類にサインするのと同じ)

名前だけなら誰でも簡単に偽装できてしまいますが、署名は暗号鍵を持っている本人しか行えないので、確実に本人がコミットしたことを証明できるようになります。

GitHubでコミットに対して署名した場合、以下のように「Verifiedバッジ」が付与されるようになります。(実際の表示をGitHubのページで確認できます)

GitHubのコミット署名の仕組み

GitHubではGPG(GNU Privacy Guard)もしくはS/MIMEによる署名に対応しています。いずれも、昔から存在する秘密鍵と公開鍵を使った公開鍵暗号方式による署名が使われています。

作成したGPG(もしくはSSH)の鍵を事前にGitHubに登録しておき、コミット時に対応する鍵を使って署名することで、本人かどうかのチェックがGitHub側で行われるようになります。そのため、GitHubでコミット署名を行うためには、以下の条件を全て満たしておく必要があります。

  • GitHubで利用するGPG(もしくはSSH)の鍵を生成しておく
  • 生成した鍵をGitHubに登録しておく(この鍵を使いますよ…ということ)
  • コミット時に生成した鍵を使って署名(これを忘れると署名が付かない)

Webブラウザ経由でGitHubを操作した場合

少しややこしいのですが、Webブラウザ経由でGitHubの操作を行った場合、自動でGitHubのGPG鍵を使った署名が行われます。(これは操作しているのはGitHubにログインしている本人…ということが分かっているためだと思われます)

そのため、GitHubのWebページ経由でREADME.mdなどを編集した場合、(独自に作成したGPG鍵ではなく)GitHub側のGPG鍵が使用され、自動で「Verified」バッジが付与されます。

利用された鍵の情報は「Verified」バッジをクリックすると確認できるのですが、GitHub側のGPG鍵が利用されている場合はGPG key ID: 4AEE18F83AFDEB23と表示されます。

GitHubのコミット署名を有効にする手順

コミット署名を有効にする手順はGitHubヘルプの「コミット署名の検証を管理する」というページにも説明があるのですが、各操作で色々なページにジャンプする必要があり、全体的な流れが分かりづらいかもしれません。ここでは、本家の手順に従って要点をピックアップして説明したいと思います。(必要に応じて本家のヘルプもご参照ください)

前提条件

GitHubのコミット署名にはGPG、もしくはS/MIMEが利用できますが、S/MIMEは認証局が必要…など、利用するためのハードルが高いので、ここでは誰でも簡単に導入できるGPGを前提にします。

また、GitやGPGを利用するために次のソフトをインストールしています。Windowsを利用している場合、Git for Windowsをインストールしておけば必要な環境が全て整うのでおすすめです。

  • Git for Windows 2.26.2
  • GPG 2.2.20(Git for Windowsに入っている)
  • Git Bash(Git for Windowsに入っている)
    ※GitやGPGが利用できれば通常のコマンドプロンプトでもOKなはずです

GitHubのnoreplyメールアドレス作成

GPGの鍵を作成する時にメールアドレスが必要になるのですが、このメールアドレスは全世界に公開されてしまいます。個人のメールアドレスを公開することは、スパムメールの標的になりやすい等の理由から、あまり推奨されません。

この問題に対応するため、GitHubでは専用のnoreplyメールを生成できるようになっています。GitHubのnoreplyメールは返信不可の独自メールアドレスになるため、一般に公開しても問題ありません。

noreplyメールアドレスは、GitHubにログイン後、右上のユーザーアイコンのSettings > Emailsから作成できます。EmailsのKeep my email address privateチェックを入れると個人のメールアドレスは公開されず、代わりにID+Username@users.noreply.github.comという形式のnoreplyメールアドレスが作成されます。(2017年より前に設定している場合はメールアドレスにIDが含まれていませんが、チェックを入れ直すとID付きのメールアドレスが再作成されます。詳細はGitHubのヘルプページをご参照ください)

このときBlock command line pushes that expose my emailにもチェックを入れておくと、間違って個人のメールアドレスでプッシュしようとした場合、自動でブロックされるようになるため、あわせてチェックしておくことをおすすめします。

メールアドレスで+より後ろはエイリアスになるため実際は何でも良いはずですが、GitHub用のGPG鍵を作成する場合はID+Username@users.noreply.github.comという形式で+より後ろのUsernameも含めた形でメールアドレスを指定する必要があるようです。

試しにID@users.noreply.github.comという形式でGPG鍵を作成してみましたが、GitHub側で正しく関連付けが行われませんでした。

GPG鍵の作成

GitHubで利用するGPG鍵を作成するため、WindowsのスタートメニューからGit Bashを起動してコンソール画面を開きます。この後の操作は、このコンソール画面を中心に作業を進めます。

なお、以下コンソールの#から始まる行はコメントになります。またコマンド先頭にある$は画面に表示されているプロンプトを表したものなので、実際は$は入力しなくてOKです。

# 既に作成済みのGPG鍵の一覧を表示する(確認用)
# GPG鍵を作成していない場合は何も表示されない
# 新規に鍵を作成する場合は、このコマンドはスキップしてもOK
$ gpg --list-secret-keys --keyid-format LONG


# GitHub用のGPGキーを新規に作成する
# いくつか入力を求められるので、以下の内容を設定
# 1. Kind of key   = 1   (RSA and RSA)
# 2. Key size      = 4096(デフォルトは2048なので4096に変更)
# 3. Key expire    = 0   (Key does not expire)→ 確認を求められるので'y'
# 4. Real name     = Taro Yamada(本名をローマ字などで)
# 5. Email address = 1234567+Username@users.noreply.github.com (GitHubのnoreplyメール)
# 6. Comment       = 無し (そのままEnter)
# 最後に~(O)kay/(Q)uit? の確認が出るので'O'(アルファベットのオー)でEnter
# パスフレーズを入力する画面が表示されたら、任意のパスフレーズ(パスワードみたいなもの)を入力
# パスフレーズは今後も使うので忘れないように!
$ gpg --full-generate-key


# 再度GPG鍵の一覧を確認
# sec: Secret key
# ssb: Secret sub key
$ gpg --list-secret-keys --keyid-format LONG

sec  rsa4096/ABCDEF0123456789 2020-04-28 [SC] # この"ABCDEF0123456789"という部分が鍵のID
     FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
uid    [ultimate] Taro Yamada <1234567+Username@users.noreply.github.com>
ssb  rsa4096/FFFF0000FFFF0000 2020-04-28 [E]


# 利用するGPG鍵をASCII armor形式で出力
# gpg --armor --export 鍵のID という形式で実行
# 鍵のIDは上記の「sec」に表示されている"rsa4096/"の後ろにある鍵のIDを指定
$ gpg --armor --export ABCDEF0123456789

-----BEGIN PGP PUBLIC KEY BLOCK-----
b0f0DERch60hPevaBV2Ze1/Fv6gZmiJn16kjO5xzLHZ+9EGFEge9mh9/mIe1F0Jd
UgdhfFa8938XFVh3EF434G38gEdvJkc98gn12E+31/FgxH1/EJFDx3edafhL3893
...
JFAe6gU1VZFO/1wx68llOMGwyMo0ih/TYMG3wA==
=nEoF
-----END PGP PUBLIC KEY BLOCK-----


# 表示されたBEGIN PGP~END PGPまでの行をコピーして次のステップに進む

GitHubに生成したGPG鍵を登録

GitHubのSSH and GPG keysの設定ページNew GPG keyボタンをクリックし、前のステップで表示した-----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----までの内容を貼り付け、Add GPG keyボタンをクリックします。

GitHubのパスワード入力を求められるので、パスワードを入力すればGPGキーが登録されます。

Gitの署名設定

ローカルのGitでコミット署名を行うための設定を行います。
コミット署名を行うためには、利用するGitに以下の設定が必要になります。

  • user.email(メールアドレス)の設定
  • user.signingkey(署名に利用するGPG鍵のID)の設定
  • commit.gpgsign(コミット時に署名するかどうか)の設定

引き続きGit BashのコマンドプロンプトでGitの設定を行っていきます。

# 利用するメールアドレスの設定
# GPG鍵を作成する時に使用したメールアドレスを設定
$ git config --global user.email "1234567+Username@users.noreply.github.com"

# 署名に使用するGPG鍵のIDを設定
# GitHubに登録したGPG鍵の「Key ID」を指定(今回の例だとABCDEF0123456789)
# 綴りを間違えやすいので注意(signinではなくsigning. サインインではなくサイニング)
$ git config --global user.signingkey ABCDEF0123456789

# コミット時の署名を有効にする
$ git config --global commit.gpgsign true

これでGitHubでコミット署名を行う設定は完了です。

Gitの設定は、全環境で共通なグローバル環境と、各リポジトリごとのローカル環境に対して行うことが可能です。git config --globalという形で--globalオプションをつけた場合は、グローバル環境に対して設定が行われることになります。

設定の優先度としては、グローバル環境よりもローカル環境が優先されるため、ローカル環境で個別に設定を上書きすることも可能です。
例えば、グローバル環境でcommit.gpgsign trueと設定してあった場合でも、個別のGitリポジトリでcommit.gpgsign falseと設定すれば、個別に設定した値が適用されます。

個別のリポジトリで最終的に適用される設定や、グローバル環境に対する設定は以下のコマンドで確認できます。

# グローバル環境(全環境共通)の設定を確認
$ git config --list --global
user.name=Taro Yamada
user.email=1234567+Username@users.noreply.github.com
user.signingkey=ABCDEF0123456789
commit.gpgsign=true

# 個別のリポジトリで有効な設定を確認
# 個別に定義している内容がなければ、グローバル環境で設定した内容が利用される
$ git config --list
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
user.name=Taro Yamada
user.email=1234567+Username@users.noreply.github.com
user.signingkey=ABCDEF0123456789
commit.gpgsign=false  # 個別に設定を行えばグローバル設定よりも個別設定が優先される

コミット方法

これまでの手順で、Gitのグローバル環境に対してコミット署名するための設定(コミットメールアドレス、署名に利用するGPG鍵の指定、コミット時に署名を行う設定)を行っているため、通常のGit操作でコミット時の署名が行われます。

コミット署名を使用する場合に変わる手順として、コミット時にパスフレーズの入力が必要になります。パスフレーズはGPG鍵を作成する時に設定した内容を入力してください。

これで、GitHubに登録しているGPG鍵とコミット署名の内容が照合され、同じGPG鍵を使っていれば自動で「Verified」バッジが付くようになります。

コミット操作をVisual StudioのようなIDE経由で行っている場合、そのIDEが利用しているGit環境に対して署名設定(メールアドレスの設定やGPG鍵のID指定など)が必要になる場合があります。Gitを複数インストールしてPATHを通している場合などはご注意ください。