まずはこちらの画像をご覧ください。
GitHubのコミット履歴ですが、コミットのSHAの左に見慣れないものが表示されていますね。
クリックすると画像のような情報が表示されます。
実は、GitHubは2016/4/6からGPGによりデジタル署名されたコミットやタグにバッジを表示するようになりました。
この記事はその設定ガイドです。私の環境はWindowsですが、すべてコマンドラインとブラウザ上での操作なのでMacやLinuxでも同じように行えます。
なお、GitHub DesktopやGitKrakenはGPGによる署名をサポートしていません。
1. GPGツールをインストール
ここからツールをダウンロード・インストールします。バイナリのダウンロードリンクは下のほうにあります。
インストール手順は難しくないので省略します。
2. GPG鍵ペアを生成
以下のコマンドを実行します。なお、鍵の長さ、名前、メールアドレスなどを後で修正することはできませんのでご注意ください。1
$ gpg --gen-key
gpg (GnuPG) 2.0.30; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ご希望の鍵の種類を選択してください:
(1) RSA と RSA (デフォルト)
(2) DSA と Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
あなたの選択は?
ここでは1
を入力します。
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
鍵の長さは長いほど安全です。GitHubでは4096
ビットにすることが推奨されているので、そうしましょう。
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で期限切れ
<n>w = 鍵は n 週間で期限切れ
<n>m = 鍵は n か月間で期限切れ
<n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
特に理由がなければ0
でいいでしょう。
鍵の有効期間は? (0)は無期限です
これで正しいですか? (y/N)
y
を入力します。
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。
本名:
本名と書かれていますが、会社等の組織で使用するのでなければ本名でなくても構いません(GitHubのIDなど)。ここで入力した内容は他のユーザーがコミット履歴から確認することができますのでご注意ください。
電子メール・アドレス:
GitHubに登録されている認証されたメールアドレスを入力してください。ここから確認できます。ここで入力した内容は他のユーザーがコミット履歴から確認することができますのでご注意ください。
コメント:
何も入力しなくて構いません。
次のユーザIDを選択しました:
"prince-0203 <mc.prince.0203@gmail.com>"
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)?
間違っていなければO
を入力します。
秘密鍵を保護するためにパスフレーズがいります。
秘密鍵を保存するためのパスワード(パスフレーズ)を入力します。Windowsではパスワード入力のダイアログが表示されます。今後デジタル署名してコミットしたりタグをつけたりする際にこのパスワードが必要になりますので、忘れないよう保管しておいてください。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
鍵の生成中です。指示通りにマウスを動かしたりキーボードをランダムに打ったりして、しばらく待ちましょう。
gpg: 鍵12029D92を究極的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。
生成完了です。
3. 公開鍵をGitHubに登録
以下のコマンドを実行します。
$ gpg --list-keys
以下のような表示がされるはずです。
C:/Users/prince/AppData/Roaming/gnupg/pubring.gpg
-------------------------------------------------
pub 4096R/12029D92 2016-04-10
uid [ 究極 ] prince-0203 <mc.prince.0203@gmail.com>
sub 4096R/3EA5B922 2016-04-10
鍵のIDをコピーします。ここでは12029D92
です。
続いて以下のコマンドを実行します。※IDの前後のかっこは入力しないでください。
$ gpg --armor --export <コピーした鍵のID>
以下のような表示がされるはずです。
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQINBFcJ6QcBEADe70sEQC7ATz1d/8YHIf/ZjKd4ILpZ+1DZmwTM8TP0x+66Fx/T
drXEiPsFnp5vrNQE6WqQyNOlQCKM620JRmIzzCmLTe8j0NqJTbt1+TMJPKfq1Cgh
(長いので中略)
wgigO2D1BuF+AgrxLZNYU1oPy5eH2H9h6c1CVgxiQtJzAThP4AusP9wByvwt2GUC
6etZ3nqxmHVmfeUrJUgnf4YwlYP/Jp7fd5+KLx87ACjWv18tD08xhxKx0Y9l2/qa
ixCCbw+M
=h3oF
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
から-----END PGP PUBLIC KEY BLOCK-----
までをコピーします。
次に、GitHubのSSH and GPG keysにアクセスし、New GPG Keyをクリックします。
Keyに先ほどコピーした公開鍵(-----BEGIN PGP PUBLIC KEY BLOCK-----
から-----END PGP PUBLIC KEY BLOCK-----
まで)を貼り付けます。
これでGitHubへの鍵の登録は完了です。
4. 鍵をGitに認識させる
以下のコマンドを実行します。
$ gpg --list-keys
以下のような表示がされるはずです。
C:/Users/prince/AppData/Roaming/gnupg/pubring.gpg
-------------------------------------------------
pub 4096R/12029D92 2016-04-10
uid [ 究極 ] prince-0203 <mc.prince.0203@gmail.com>
sub 4096R/3EA5B922 2016-04-10
GPG鍵のIDをコピーします。ここでは12029D92
です。
続いて以下の2つのコマンドをそれぞれ実行します。※IDの前後のかっこは入力しないでください。
$ git config --global gpg.program gpg2
$ git config --global user.signingkey <コピーした鍵のID>
これで署名されたコミットを作成する準備が整いました。
5. 署名されたコミットを作成
署名されたコミットを作成するには、git commit
に引数-S
(大文字)を付けます。
$ git commit -m "署名されたコミット" -S
また、以下のコマンドを実行するとgit commit
時に引数-S
を付けなくても署名されるようになります(--global
を外せば現在のリポジトリのみでの設定になります)。
$ git config --global commit.gpgsign true
ただし、リーナスはコミットではなくタグに署名することを推しています。タグに署名すると、
- コミットの一部ではなく、全てに対して署名できる
- コミットと署名を分離できる
などの利点があるそうです。この観点からすると、コミットに自動で署名することはあまりふさわしくありません。詳しくはこの記事のコメント欄をご覧ください。
6. 署名されたタグを作成
署名されたタグを作成するにはgit tag
に-s
(小文字)を付けます。
$ git tag -s mytag
これで設定は完了です。試しにコミットしてみるといいでしょう。
7. 参考
- GPG signature verification
- Git - Signing Your Work
- GitHub Help
- Gitで署名付きCommitsやtagを作る | INSANEWORKS,LLC
-
内容を修正したい場合は、鍵を作り直した上で新しい鍵をGitHubに登録する必要があります。 ↩