Gitのコミットには、ユーザのメールアドレスが記録されています。メールアドレスを使って、誰がコミット作成者(Author)やコミット実施者(Committer)であるかを判別する仕組みになっています。
しかし、メールアドレスは各自が git config
で設定する属性です。実のところ、設定を変更すれば他者へのなりすましが簡単にできてしまいます。
なりすましの対策として、Gitのコミットにデジタル署名をすることで、なりすましではなく本人であることを示せます。とくに、GitHubで設定しておけば、署名つきコミットに対して「Verified」バッジが表示されます。
本記事では、macOSでGitのコミットに署名し、GitHub上で「Verified」バッジが表示されるよう設定する方法を紹介します。
必要なツールのインストール
以下、macOSを使う前提とします。また、Homebrewが導入されている前提とします。
HomebrewでGnuPGをインストールします。
brew install gnupg
GnuPGは、RFC4880で定義されたOpenPGP規格を実装したソフトウェアです。データや通信を暗号化したりデジタル署名を付けたりできます。GnuPGはGPGとも呼ばれます。
もうひとつ、Homebrewでpinentry-macをインストールします。
brew install pinentry-mac
GPGTools/pinentryは、パスフレーズの入力をサポートするソフトウェアです。pinentry-macはpinentryのmacOS版で、とくに、パスフレーズをキーチェーンに保存する機能が便利です。
GPGキーの生成
署名に使う公開鍵・秘密鍵のペアを生成します。先ほどインストールしたGnuPGを使います。
GitHubのドキュメント「新しい GPG キーを生成する - GitHub Docs」に手順が詳しく書いてありますので、このとおりに実行します。
鍵の種類やサイズを聞かれますが、デフォルトのままで問題ありません。自分の好みで変更してもかまいません。
GPGキーのパスフレーズも聞かれます。このパスフレーズはあとでコミットへの署名のときに使うので、忘れないようにしてください。
GitHubアカウントの設定
生成した鍵ペアの公開鍵をGitHubアカウントに追加します。この設定により、GitHub上で署名つきコミットに対して「Verified」バッジが表示されます。
GitHubのドキュメント「GitHub アカウントに GPG キーを追加する - GitHub Docs」に手順が詳しく書いてありますので、このとおりに実行します。
Gitの設定
生成した鍵ペアのキーIDをGitの設定に追加します。この設定により、Gitのコミットに対して指定の秘密鍵で署名できます。
GitHubのドキュメント「Git へ署名キーを伝える - GitHub Docs」に手順が詳しく書いてありますので、このとおりに実行します。
ただし、今回はすでにpinentry-macをインストールしています。このため、「GPGスイートを使用していない場合は〜」と記載がある、シェルで環境変数 GPG_TTY
を設定する手順はスキップします。代わりにpinentry-macを設定する手順を実行します。
コミットへの署名
Gitでコミットを署名つきコミットにするには、次のようにします。これですべてのコミットが署名つきになります。
git config --global commit.gpgsign true
署名つきコミットの際、GPGキーのパスフレーズを聞かれます。pinentry-macの設定ができていれば、次のようなダイアログが表示されますのでパスフレーズを入力します。なお、「Save in Keychain」を有効にしておくと、パスフレーズがキーチェーンに保存されます。
保存されたパスフレーズは、macOSのキーチェーンアクセスで「GnuPG」を検索すると確認できます。
パスフレーズは、コミットごとに聞かれるわけではありません。一度入力するとgpg-agentが覚えてくれます。そのため、署名つきコミットにしたからといって、コミットの手間がそれほど増えるわけではありません。
なお、すべてのコミットを署名つきにするのではなく特定のコミットだけ署名つきにするには、上記の設定をせずにおき、コミット時に git commit -S
と -S
オプションをつけます。しかし、通常はすべてのコミットを署名つきにするのが良いでしょう。
まとめ
以上で、Gitのコミットに署名し、GitHub上で「Verified」バッジが表示されるよう設定できました。
ここではmacOSでの方法を紹介しましたが、それ以外のOSについてはGitHubのドキュメントか別の記事を参照してください。