macOSでGitHubにGPG署名付きコミット&pushをしてみる。

[2018/10/1 更新] GPG Suiteで必要なものが全てインストールできるため、homebrewでのインストール部を削除しました。

Gitで署名付きコミットをして、GitHubにpushした時のメモ。

1.必要なパッケージをインストールする

GPG署名を行うにあたり、キーを作成する必要がある。
また、macOSではパスフレーズを入力する際に別途パッケージが必要となる。
今回は必要なパッケージが全て揃ったGPG Suiteを使って行なっていく。

まず、GPG Suiteをインストールする。
ダウンロードは公式サイトから行うことができる。
https://gpgtools.org/

ダウンロードが完了し、dmgファイルを開くと次の画面になるので「Install.pkg」をダブルクリックする。
環境によっては「Install」という表記であるが、違いはないのでそのままダブルクリックしてインストーラーを起動させる。

インストーラーが起動するので以下の画面まで、画面の指示に従って進めていく。

この画面になったら、左下の「カスタマイズ」を選択する。
すると以下の画面になるので、「GPG Mail」のチェックを外してから「インストール」ボタンを押しインストールする。

これで必要なものは揃った。
という事でGitにどのソフトで署名するかを教えてあげる必要がある。
まず、ターミナルで以下のコマンドを入力。

git config --global gpg.program /usr/local/MacGPG2/bin/gpg2

続いて、~/.gnupg/gpg-agent.confを開き、以下を追記する。

pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac

最後に、~/.gnupg/gpg.confを開き以下を追記。

no-tty

これで準備完了だ。

他のサイトだと、gpg-agentをhomebrewでインストールすると書いてあったが、

Error: No available formula with the name "gpg-agent" 

とエラーが発生してしまい、インストールをできなかったため簡単にインストールできるGPG Suiteを使用した。

2.GPG鍵を生成する

続いて、署名に用いるGPG鍵を生成する。
先ほどインストールしたGPG SuiteでGUI上で鍵の生成も行えるが、当記事では一般的なターミナルを用いて生成を行なっていく。
GPG鍵の生成には

gpg --full-generate-key

というコマンドを用いる。

gpg --gen-key

というコマンドでもいいが、細かく設定を行うために–full-generate-keyを用いる。
コマンドを入力すると

gpg (GnuPG) 2.2.10; Copyright (C) 2018 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を入力してEnterキーを押す。
続いてRSA鍵の長さを聞かれるので最大の4096を指定。

RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) 4096

次に鍵の有効期限を聞かれるので無期限を選択。
この場合、0を入力するか、そのままEnterキーを押す。

要求された鍵長は4096ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) 

以下のように確認されるので、よろしければyを入力しEnter。

鍵は無期限です            
これで正しいですか? (y/N) 

続いて以下のように、名前、メールアドレス、コメントを聞かれるので入力していく。
名前は本名でなくても良い。
メールアドレスはGitHubに登録してあるメールアドレスを入力しておく。
コメントはとくに入力しなくて良い。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: あなたの名前
電子メール・アドレス: あなたのメールアドレス
コメント:     

入力すると以下のように確認されるので、よろしければOを入力しEnterキーを押す。

次のユーザIDを選択しました:
    "あなたの名前 <あなたのメールアドレス>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? 

Oを入力し、Enterキーを押すと次のダイアログがでる。

ここで、設定したいパスフレーズを入力する。
ダイアログでわかる通り、Repeatは確認なので、パスフレーズに入力後、Repeatに再度入力する。
入力後、OKを押すと次のメッセージが表示される。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か               
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。

という事で適当にマウスやキーボードを触る。
生成が終わると次のようなメッセージが表示される。

gpg: 鍵<文字列>を究極的に信用するよう記録しました
gpg: 失効証明書を '/Users/ユーザー名/.gnupg/openpgp-revocs.d/<文字列>.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   rsa4096 2018-09-29 [SC]
      <鍵ID>
uid                      本名で指定した名前 <あなたのメールアドレス>
sub   rsa4096 2018-09-29 [E]

これでGPG鍵の生成が完了した。

3.Git、GitHubにGPG鍵を登録する

続いてGPG鍵の登録を行う。
先ほど鍵生成が完了した時、

pub   rsa4096 2018-09-29 [SC]
      文字列

が表示されたと思う。この文字列の部分が鍵IDとなる。
今後は文字列の部分を鍵IDと記す。

では、鍵のASCII codeを出力させるために次のコマンドを入力してEnterキーを押す。

gpg --armor --export 鍵ID

すると次のような表示が出る。

-----BEGIN PGP PUBLIC KEY BLOCK-----

とても長い文字列がここ表示される。
-----END PGP PUBLIC KEY BLOCK-----

この、—–BEGIN PGP PUBLIC KEY BLOCK—–から—–END PGP PUBLIC KEY BLOCK—–までコピーしておく。
コピーしたらGitHubのGPG鍵登録ページにアクセスする。
https://github.com/settings/keys

アクセスすると次のような画面が出るため、「GPG Keys」の隣にある「New GPG Key」をクリックする。

ボタンをクリックすると以下の表示が出るので、テキストボックスに先ほどコピーしたものをペーストする。

ペーストしたら「Add GPG Key」をクリックして登録する。
登録後、前のページに戻りGPG鍵が登録される。

これで、GitHubへの鍵の登録は完了である。
続いて、Gitへの鍵の登録を行う。
ターミナルに戻り、Gitに鍵を認識させるため以下のコマンドを行う。

 git config user.signingkey 鍵ID

次に、今回GPG鍵の生成に使用したメールアドレスをGitに設定する。
設定理由は、同じメールアドレスをローカル側にも登録しておかないと、GitHubにpushした時に「Unverified」と表示されてしまう。
尚、既に同じメールアドレスを設定している場合は以下のコマンドは不要である。

git config user.email あなたのメールアドレス

これでGitへのGPG鍵の登録は完了である。

4.署名付きコミットをして、GitHubにpushする

では早速署名付きコミットをしてみる。署名付きコミットは-Sオプションをつける事で行える。

git commit -S -m "Signed"

このコマンドを実行すると以下のダイアログが表示され、パスフレーズを聞かれる。ここで、鍵生成の時に登録したパスフレーズを入力する。

正しいパスフレーズを入力するとコミットされる。
尚、-Sオプションをつけずに常に署名を行う場合は以下のコマンドを入力すると、常に署名される。

git config --global commit.gpgsign true

コミットができたらGitHubにpushしてみる。
pushは従来通り、git pushで行なって良い。
push後、GitHubのコミット履歴のページを見ると、Verifiedと表示される。

これで署名付きコミットを行い、GitHubにpushし認証できた。

参考文献

git(GitHub)でGPGを使った署名をおこなう | Qiita
Git – 作業内容への署名


コメントいかがですか。