Keybase の鍵で GitHub のコミットに Verified バッジをつける

GitHubではコミットに「Verified」マークを付けることができます。

<img width="874" alt="スクリーンショット 2019-09-10 21.22.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/b60759c9-bd74-2453-a2f2-9cc8a32fe3e1.png">

Verified なコミットは、GPG(GNU Privacy Guard)キーがあれば作成できます。

公開鍵基盤 [Keybase](https://keybase.io/) は公開鍵の保管や、公開鍵によるWebサイト・SNSアカウントの認証がお手軽にできるサービスです。ここでは既にKeybaseのユーザである方向けに、Keybaseの認証鍵を GPG に登録し、Verified なコミットを生成する方法をまとめておきます。Keybaseの登録・利用方法についてはここでは触れません。
macOS前提で書いていきます。

# 環境変数 GPG_TTY の設定

```bash
export GPG_TTY=$(tty)
# fish shell なら `set -x GPG_TTY (tty)`
```

を `.bashrc` 等に書きます。
この環境変数が必要な理由: https://github.com/keybase/keybase-issues/issues/2798

# GPG のセットアップ

```bash
brew install gnupg pinentry-mac
```

`gpg-agent` を入れさせようとする記事が多いですが、現在は不要です。理由: https://stackoverflow.com/questions/52435650/gpg-agent-not-found-for-homebrew/52456873

その後

```bash
echo "pinentry-program /usr/local/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
```

pinentry はパスフレーズ入力で使います。

# Keybase の鍵を GPG に登録する

CLIツールとして `keybase` が使える必要があります。もし、使えなかったら https://keybase.io/download からダウンロードしたり、PATHがきちんと通っているかを確認したりしましょう。
また、コマンドを打つ前に Keybase のアプリケーションを立ち上げてログインしておいてください。

まず公開鍵を GPG に import します。

```bash
keybase pgp export | gpg --import
```

次に秘密鍵を GPG に import します。

```bash
keybase pgp export --secret | gpg --allow-secret-key --import
```

<img width="437" alt="スクリーンショット 2019-09-10 21.56.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/42cd608c-1825-8d7d-7095-96d8965abd77.png">

秘密鍵の方はこういう風にパスフレーズを設定することになるはずです。

# GPG の鍵を使って Git で署名付きコミットを行う

前述した設定がうまくいけば、

```bash
gpg --list-secret-keys
```

で

```
/Users/XXXXX/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096 2019-01-25 [SC] [有効期限: 2035-01-21]
      1C48036***********************
uid           [  不明  ] HelloRusk <hellorusk1998@gmail.com>
ssb   rsa4096 2019-01-25 [E] [有効期限: 2035-01-21]
```

このようにGPGに登録した鍵情報が表示されます。
ここで表示されているメールアドレス（`hellorusk1998@gmail.com`の部分）と、コミットで利用するメールアドレスを一致させる必要があることに気をつけてください。
`1C48036***********************` が署名キーで、これを Git に以下のように記憶させます。

```bash
git config --global user.signingkey 1C48036***********************
git config --global gpg.program $(which gpg)
```

これで、普段のコミットコマンドに`-S`オプションを足した

```bash
git commit -S
```

で署名付きコミットができるようになりました。
なお、毎回`-S`を足すことなく自動署名させたい場合は

```bash
git config --global commit.gpgsign true
```

とすればよいです。

また `git log` でも`--show-signature`オプションを付けることにより、署名を確認できます。署名付きコミットは以下のように表示されます。

```
* 45fd2de gpg: 火  9/10 21:00:25 2019 JSTに施された署名
| gpg:                RSA鍵1C48036***********************を使用
| gpg: "HelloRusk <hellorusk1998@gmail.com>"からの正しい署名 [不明の]
| gpg: *警告*: この鍵は信用できる署名で証明されていません!
| gpg:       この署名が所有者のものかどうかの検証手段がありません。
|  主鍵フィンガープリント: 1C48 **** **** **** ****  **** **** **** **** ****
| verified commit
```

# GitHub に Keybase の公開鍵を登録する

あとは、GitHubに署名付きコミットをpushした時に、GitHub側にそれを信頼させればよいです。

https://github.com/settings/keys を開いて、下側にある「GPG keys」から「New GPG key」ボタンをクリックすると、公開鍵を貼り付ける画面が出てきます。

<img width="792" alt="スクリーンショット 2019-09-10 22.32.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/ccdc9580-e0aa-39be-aa80-3f19dbcc9731.png">

ここに、Keybaseの公開鍵を貼り付けます。Keybaseの公開鍵は、鍵マークの横にある文字列をクリックすると出せます。

<img width="598" alt="スクリーンショット 2019-09-10 22.34.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/029772a9-8dee-1fec-d9cc-255693063659.png">

赤丸の部分をクリックして...

<img width="592" alt="スクリーンショット 2019-09-10 22.38.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/a3b1772c-e5b4-b178-a13e-9805e45bfbf9.png">

`-----BEGIN PGP PUBLIC KEY BLOCK-----`から始まる文字列ですね。
なお、Keybase認証鍵で使っているメールアドレスが GitHub 側でも登録されている必要があります。登録されていなければ、「GPG keys」の画面で、メールアドレスの横に「Unverified」と書かれていると思うので、 https://github.com/settings/emails からそのメールアドレスを新しく登録しましょう。

# Reference

- https://gist.github.com/webframp/75c680930b6b2caba9a1be6ec23477c1