メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

GitHubのコミット履歴にVerifiedマークを付けるためにGPGの設定をした

Verifiedマークをコミットリストに表示させる

環境

macOS Mojave 10.14.2
Homebrew 2.0.2

Verifiedマークとは

コミットリストのこんなマーク。署名付きのコミットであることを表しており、GitHubによるとコミットの信頼性が高まるよ、とのこと。
図で一番最初のコミットにVerifeidが付いているのはWebで操作したためです。何も設定していないでコミットした他の変更はVerifiedマークが付いていません。

Verifiedマーク

なんかカッコイイので付けることにしますw

手順; コマンド

Macの場合インストールはbrewです。

$ brew install gnupg

インストールが完了するとgpgコマンドが実行できるようになるので、次のようなコマンドでバージョンを確認するなどして、インストールの完了を確認します。

$ gpg --version
gpg (GnuPG) 2.2.13
libgcrypt 1.8.4
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/my-user-name/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2

実際にGPGキーを生成するコマンドは次のとおり。
ウィザードが出てきますので入力していきます。

$ gpg --full-generate-key
gpg (GnuPG) 2.2.13; Copyright (C) 2019 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) RSARSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は? 1
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) [エンターキー]
鍵は無期限です            
これで正しいですか? (y/N) y
                                    
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: ******** ********
電子メール・アドレス: ********@users.noreply.github.com
コメント: GitHub
次のユーザIDを選択しました:
    "******** ******** (GitHub) <********@users.noreply.github.com>"

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

途中、謎の文字化けしたメッセージが出てきます。きっとテキストでウィンドウを表現しようとして文字化けしているんだと思います。そのままTabでOKらしい部分にフォーカスをあててEnterを何度かしてみましたが、ウィザードが進みませんでした。
ここではパスフレーズとしてGitHubのパスワードを入力しました。

┌──────────────────────────────────────────────────────────────┐
│ ?~V??~A~W?~A~D?~M??~B~R?~]護?~A~Y?~B~K?~A~_?~B~A?~A??~@~A    │
│ ?~C~Q?~B??~C~U?~C??~C??~B??~B~R?~E??~J~[?~A~W?~A??~A~O?~A??~A~U?~A~D?~@~B
│                                                              │
│ ?~C~Q?~B??~C~U?~C??~C??~B?: ________________________________________
│                                                              │
│         <OK>                            <?~B??~C??~C??~B??~C?(C)>
└──────────────────────────────────────────────────────────────┘

こんな感じのメッセージも出ることがあるかと思います。Enter。

┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ?~C~Q?~B??~C~U?~C??~C??~B??~A~L?~E??~J~[?~A~U?~B~L?~A??~A~[?~B~S?~A??~A~W?~A~_ - ?~@~Z常?~A~S?~B~L?~A??~I??~A~O?~A??~A~D?~@~C?~A~H?~A??~A~Y!                             │
│ ?~M??~A??~U?~A??~]護?~B~B?~E?~A?~A??~A~W?~A??~A~D?~A~S?~A??~B~R確?~M?~A~O?~A??~A~U?~A~D?~@~B                                                                             │
│                                                                                                                                                                          │
│        <?~A??~A~D?~@~A?~]護?~A??~E?~A?~A~B?~B~J?~A??~A~[?~B~S>                                                  <?~V??~A~W?~A~D?~C~Q?~B??~C~U?~C??~C??~B??~B~R?~E??~J~[?~A~W?~A
??~A~O?~A??~A~U?~A~D>──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

ウィザードに戻りました。他の操作を〜の部分などが表示されて進んでいるのが確認できると思います。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か               
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: /Users/my-user-name/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵8H7G6F5E4D3C2B1Aを究極的に信用するよう記録しました
gpg: ディレクトリ'/Users/my-user-name/.gnupg/openpgp-revocs.d'が作成されました
gpg: 失効証明書を '/Users/my-user-name/.gnupg/openpgp-revocs.d/A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   rsa4096 2019-02-21 [SC]
      A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0
uid                      ******** ******** (GitHub) <********@users.noreply.github.com>
sub   rsa4096 2019-02-21 [E]

無事に生成されたようです。確認コマンドは次のとおり。
sec rsa4096/ に続いて表示されている文字列がidです。

$ gpg --list-secret-keys --keyid-format LONG
/Users/my-user-name/.gnupg/pubring.kbx
gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   6  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 6u
/Users/my-user-name/.gnupg/pubring.kbx
-------------------------------------
sec   rsa4096/8H7G6F5E4D3C2B1A 2019-02-21 [SC]
      A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0
uid                 [  究極  ] ******** ******** (GitHub) <********@users.noreply.github.com>
ssb   rsa4096/01A23456789012B3 2019-02-21 [E]

設定を間違えて生成してしまったなどの場合は --remove-secret-key で削除できます。この場合も文字化けウィザードが出てきますが、Enterで続行できます。

$ gpg --delete-secret-keys 8H7G6F5E4D3C2B1A
gpg (GnuPG) 2.2.13; Copyright (C) 2019 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.


sec  rsa4096/8H7G6F5E4D3C2B1A 2019-02-21 ******** ******** (GitHub) <********@users.noreply.github.com>

この鍵を鍵リングから削除しますか? (y/N) y
これは秘密鍵です! 本当に削除しますか? (y/N) y

先程の確認コマンドで表示したリストの中のsecの方の文字列をコピーしてexportします。

$ gpg --armor --export 8H7G6F5E4D3C2B1A
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBFxuek8BEADG0+XqpW6ZwfAlxGSR0zoDEoIRhMnbIlhGutO5dXpAM5WxAubc
(中略)
=1RsF
-----END PGP PUBLIC KEY BLOCK-----

長ーい文字列が表示されますので、頭の-----から終わりの-----まで選択してコピーします。
それをGitHubのSettings ⇒ SSH and GPG keysに貼り付けます。
https://github.com/settings/keys

New GPG key

git configで署名付きの設定を行う

ここからgit conifgでコミットする場合に署名を付ける方法と、署名のキーの指定を行います。コマンドには --global オプションが付いていますが、各リポジトリで別々に指定したい場合は --global オプションではなく --local オプションを指定するか、何も指定しないよう(デフォルト)にします。

まずは、署名キーの設定です。次のコマンドは、"署名を付ける場合"に指定されるキーです。

$ git config --global --add user.signingkey 8H7G6F5E4D3C2B1A

この時点でコミットしてもVerifiedマークは付きません。コミットする場合 -S オプションを指定して、コミットに署名を付けます。

$ git commit -S -m "Your commit message."

とうぜん、毎回-Sを付けるのは面倒なので、常に署名がつくようgit configで設定します。

$ git config --global --add commit.gpgsign true

ためしに何かしらコミットしてみます。

$ touch test
$ git add test
$ git commit -m "test"

初回のみ、コミットをする時にパスフレーズを聞かれます。

┌──────────────────────────────────────────────────────────────────────────────┐
│ OpenPGP?~A??~X?~F?~M??~A??~C??~C~C?~B??~B~R解?~Y??~A~Y?~B~K?~A~_?~B~A?~A??~
│ ?~E??~J~[?~A~W?~A??~A~O?~A??~A~U?~A~D:                                       │
│ "******** ******** (GitHub) <********@users.noreply.github.com>"             │
│ 4096?~C~S?~C~C?~C~HRSA?~M?, ID 9431AFBD08C2B327,                             │
│ ?~\?~H~P?~W??~X 2019-02-23.                                                  │
│                                                                              │
│                                                                              │
│ ?~C~Q?~B??~C~U?~C??~C??~B?: __________________________________________________
│_____                                                                         │
│           <OK>                                        <?~B??~C??~C??~B??~C?(C)
>──────────────────────────────────────────────────────────────────────────────┘

さきほど入力したパスフレーズを入力して乗り切ります。

$ git push -u origin master

これで晴れてVerifiedマークが付きました!

f:id:ryoichi0102:20190223153310p:plain

参考

help.github.com