GitHubのコミットに署名してVerifiedマークが表示されるようにする。
すでにGitHubを利用したことがあるMacユーザが対象。

NOTE: 記事公開時点でGitHub Desktopはコミット署名をサポートしていない。

新しいGPGキーを生成する

GPG (Gnu Privacy Guard)は、ファイルの署名を検証したり、メールの暗号化・復号化を行うことができるツール。
PGP(Pretty Good Privacy)というツールをGNUライセンスにしたものがGPG。
ローカルで生成したGPGの公開キーをGitHubに追加することで、コミットに署名がつくようになる。

1. GPGツールのインストール

$ brew install gpg

2. GPGキーの生成 (対話形式)

[Press enter] となっているところは、基本的にデフォルトでOK。
Email address.gitconfig で指定しているメールアドレスにする必要がある。

$ gpg --full-gen-key

> Please select what kind of key you want:
>    (1) RSA and RSA
>    (2) DSA and Elgamal
>    (3) DSA (sign only)
>    (4) RSA (sign only)
>    (9) ECC (sign and encrypt) *default*
>   (10) ECC (sign only)
>   (14) Existing key from card
> Your selection? [Press enter]

> Please select which elliptic curve you want: 
>    (1) Curve 25519 *default*
>    (4) NIST P-384
>    (6) Brainpool P-256
> Your selection? [Press enter]

> Please specify how long the key should be valid. 
>          0 = key does not expire      
>       <n>  = key expires in n days    
>       <n>w = key expires in n weeks   
>       <n>m = key expires in n months  
>       <n>y = key expires in n years 
> Key is valid for? (0) [Press enter]

> Key does not expire at all
> Is this correct? (y/N) y

> Real name: YOURNAME
> Email address: YOUREMAIL(.gitconfigと同じ)
> Comment: COMMENT(任意)

> You selected this USER-ID:
>     "YOURNAME (COMMENT) <YOUREMAIL>"
> Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

最後にパスフレーズを2回入力する。コミット時に使用するので忘れないようにする!

> ┌──────────────────────────────────────────────────────┐
> │ Please enter the passphrase to                       │
> │ protect your new key                                 │
> │                                                      │
> │ Passphrase: ________________________________________ │
> │                                                      │
> │       <OK>                              <Cancel>     │
> └──────────────────────────────────────────────────────┘

3. GPGキーIDの確認

GPGのリストを表示して、[GPGキーID] の部分を確認する。

$ gpg --list-secret-keys --keyid-format=long

> /Users/username/.gnupg/pubring.kbx
> ------------------------------------
> sec   ed25519/[GPGキーID] YYYY-MM-DD [SC]
>       ****
> uid     [ultimate] YOURNAME (COMMENT) <YOUREMAIL>
> ssb   cv25519/**** YYYY-MM-DD [E]     

4. 公開キーをクリップボードにコピー

GitHubに追加するときに必要なのでコピーしておく。

$ gpg --armor --export [GPGキーID] | pbcopy

5. 秘密キーのエクスポート(任意)

PCの買い替えなどで、環境が変わる度にGPGキーを生成したくない方はエクスポートしておくと良い。

$ gpg --export-secret-keys [GPG キー ID] > seckey.gpg

以下のコマンドでインポートできる。

$ gpg --import seckey.gpg

GitHubアカウントにGPG公開キーを追加する

1. GitHubの Settings > SSH and GPG keys にある New GPG key ボタンをクリック

2. Key フィールドに、GPG公開キーの内容を貼り付け

GPGキーの生成で、クリップボードにコピーしておいた公開キーを貼り付ける。

3. Add GPG key をクリック

保存できていれば、以下のように表示されているはず。

コミットに署名する

.gitconfig にGPGキーIDを設定する。

[user]
  name = YOURNAME
  email = YOUREMAIL
  signingkey = GPGキーID

あとは、コミット時に S オプションを付けるだけで署名付きになるが、GPGキー生成時に設定したパスフレーズを入力する必要がある。

$ git commit -S -m '署名付きコミット'

S オプションがなくても、コミットを常に署名付きにしたい場合は .gitconfig に以下を追記しておく。

[commit]
  gpgsign = true

コミットしたらエラーが出た!

環境に依るよが、コミットしたときに以下のようなエラーが出ることがある(自分は出た)。

> error: gpg failed to sign the data
> fatal: failed to write commit object

その場合は、.zshrc などに以下を追記すると良いらしい。

export GPG_TTY=$(tty)

反映を忘れずに。

$ source ~/.zshrc

パスフレーズを毎回入力するのがめんどい!

パスフレーズの入力に pinentry-mac を利用すれば、Mac標準のKeychainが使える。

$ brew install pinentry-mac

以下のコマンドを実行して、GPGで利用するPinentryのパスを指定する。
Intel MacとM1 Macではパスが違っているので、パスを確認してから指定するべき。

$ which pinentry-mac

> /usr/local/bin/pinentry-mac
$ echo "pinentry-program /usr/local/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf

設定変更を反映させるにはGPGの再起動が必要なため、gpg-agent を以下のコマンドで終了させておく。
利用時に自動で起動するため、特にスタートなどはしなくて良い。

$ gpgconf --kill gpg-agent

適当にコミットしてみる。

$ git commit -S -m '署名付きコミット' --allow-empty

パスフレーズ入力が、以下のようなダイアログに変わっているはず。
Save in Keychain のところをチェックすれば、次回からパスフレーズ入力なしで署名付きコミットができる。

M1 MacでコミットしたらGPGエラーになる!

以下の記事を参照。

おわりに

以上で、コミットにVerifiedマークが付いたはず。

関連記事