GitHubで署名されたコミットにバッジが表示されるようになったので設定してみる

まずはこちらの画像をご覧ください。
![](https://qiita-image-store.s3.amazonaws.com/0/97852/43d3da49-bb52-3604-6517-07b56221ea37.png)
GitHubのコミット履歴ですが、コミットのSHAの左に見慣れないものが表示されていますね。
![](https://qiita-image-store.s3.amazonaws.com/0/97852/fae49a51-33c7-7bee-cfca-5d4824d1d652.png)
クリックするとこのような情報が表示されます。
実は、[2016/4/6からGitHubはGPGによりデジタル署名されたコミットやタグにバッジを表示するようになりました](https://github.com/blog/2144-gpg-signature-verification)。
この記事はその設定ガイドです。私の環境はWindowsですが、すべてコマンドラインとブラウザ上での操作なのでMacやLinuxでも同じように行えます。

# 1. GPGのインストール
Git for Windowsを使っている場合は、GPGが同梱されているため追加のインストールは不要です。

それ以外の方はパッケージマネージャを使ってインストールするか、[こちら](https://www.gnupg.org/download/)からツールをダウンロードします。トップにはソースコードのリンクが掲載されており、バイナリのダウンロードリンクは下のほうにあります。
![](https://qiita-image-store.s3.amazonaws.com/0/97852/9107421e-8ac1-c213-7cca-bdcf6b464052.png)
画面の指示に従ってインストールしてください。

# 2. 鍵ペアを生成
以下のコマンドを実行します。なお、鍵の長さ、名前、メールアドレスなどを後で修正することはできませんのでご注意ください。[^1]

```bash
gpg --full-gen-key
```

```
gpg (GnuPG) 2.3.0; Copyright (C) 2021 g10 Code GmbH
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 (署名のみ)
   (9) ECC (署名と暗号化) *デフォルト
  (10) ECC (署名のみ)
  (14) カードに存在する鍵
あなたの選択は?
```

ここでは`1`を入力します。

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

鍵の長さは長いほど安全です。GitHubでは`4096`ビットにすることが推奨されているので、そうしましょう。

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

ここでは無期限（`0`）とします。期限を設定しても構いません。

```
鍵の有効期間は? (0)は無期限です
これで正しいですか? (y/N)
```

`y`を入力します。

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

本名:
```

本名と書かれていますが、Gitの署名に利用するのであれば本名でなくても構いません(GitHubのIDなど)。**ここで入力した名前は他のユーザーがコミット履歴から確認することができますのでご注意ください。**

```
電子メール・アドレス:
```

GitHubに登録されている認証されたメールアドレスを入力してください。[ここ](https://github.com/settings/emails)から確認できます。**ここで入力した内容は他のユーザーがコミット履歴から確認することができますのでご注意ください。**

```
コメント:
```

何も入力しなくて構いません。

```
次のユーザIDを選択しました:
    "Ciffelia <***@gmail.com>"

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

間違っていなければ`O`を入力します。

```
秘密鍵を保護するためにパスフレーズがいります。
```

秘密鍵を保存するためのパスフレーズを入力します。Windowsではパスワード入力のダイアログが表示されます。今後コミットやタグに署名する際にこのパスフレーズが必要になりますので、忘れないよう保管しておいてください。

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

鍵の生成中です。指示通りにマウスを動かしたりキーボードをランダムに打ったりして、しばらく待ちましょう。

```
gpg: 鍵34D88615F1C3466Dを究極的に信用するよう記録しました
gpg: 失効証明書を '(略)' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   rsa4096 2021-04-20 [SC]
      780DE93702A9E73ED3D23BF634D88615F1C3466D
uid                      Ciffelia <***@gmail.com>
sub   rsa4096 2021-04-20 [E]
```

生成完了です。

# 3. 公開鍵をGitHubに登録
以下のコマンドを実行します。

```bash
gpg --list-secret-keys --keyid-format SHORT
```

以下のような表示がされるはずです。

```
pub 4096R/12029D92 2016-04-10
uid [ 究極 ] prince-0203 <***@gmail.com>
sub 4096R/3EA5B922 2016-04-10
```

鍵のIDをコピーします。ここでは **`12029D92`** です。

続いて以下のコマンドを実行します。

```bash
gpg --armor --export コピーした鍵のID
```

以下のような表示がされるはずです。

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

mQINBFcJ6QcBEADe70sEQC7ATz1d/8YHIf/ZjKd4ILpZ+1DZmwTM8TP0x+66Fx/T
drXEiPsFnp5vrNQE6WqQyNOlQCKM620JRmIzzCmLTe8j0NqJTbt1+TMJPKfq1Cgh
(中略)
wgigO2D1BuF+AgrxLZNYU1oPy5eH2H9h6c1CVgxiQtJzAThP4AusP9wByvwt2GUC
6etZ3nqxmHVmfeUrJUgnf4YwlYP/Jp7fd5+KLx87ACjWv18tD08xhxKx0Y9l2/qa
ixCCbw+M
=h3oF
-----END PGP PUBLIC KEY BLOCK-----
```

`-----BEGIN PGP PUBLIC KEY BLOCK-----`から`-----END PGP PUBLIC KEY BLOCK-----`までをコピーします。

次に、GitHubの[SSH and GPG keys](https://github.com/settings/keys)にアクセスし、New GPG Keyをクリックします。
![](https://docs.github.com/assets/cb-6700/images/help/settings/gpg-add-gpg-key.png)

Keyに先ほどコピーした公開鍵(`-----BEGIN PGP PUBLIC KEY BLOCK-----`から`-----END PGP PUBLIC KEY BLOCK-----`まで)を貼り付けます。
![](https://docs.github.com/assets/cb-12077/images/help/settings/gpg-key-paste.png)

Add GPG Keyをクリックします。
![](https://docs.github.com/assets/cb-2898/images/help/settings/gpg-add-key.png)

これでGitHubへの鍵の登録は完了です。


# 4. 鍵をGitに認識させる
以下の2つのコマンドをそれぞれ実行します。

```bash
git config --global gpg.program gpg
git config --global user.signingkey コピーした鍵のID
```

これで署名されたコミットを作成する準備が整いました。

# 5. 署名されたコミットを作成
署名されたコミットを作成するには、`git commit`に引数`-S` **(大文字)** を付けます。

```bash
git commit -m "署名されたコミット" -S
```

また、以下のコマンドを実行すると`git commit`時に引数`-S`を付けなくても署名されるようになります(`--global`を外せば現在のリポジトリのみでの設定になります)。

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

*ただし、Gitの作者であるLinus Torvalds氏はコミットではなくタグに署名するべきだと主張しています。タグに署名すると、*

- *コミットの一部ではなく、全てに対して署名できる*
- *コミットと署名を分離できる*

*などの利点があるためです。この観点からするとコミットに自動で署名することは望ましくありません。詳しくはこの記事のコメント欄をご覧ください。*

# 6. 署名されたタグを作成
署名されたタグを作成するには`git tag`に`-s` **(小文字)** を付けます。

```bash
git tag -s mytag
```

***

これで設定は完了です。`git push`してバッジが表示されることを確認してみましょう。

# 7. 参考
- [GPG signature verification](https://github.com/blog/2144-gpg-signature-verification)
- [Git - Signing Your Work](https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work)
- [GitHub Help](https://help.github.com/categories/gpg/)
- [Gitで署名付きCommitsやtagを作る | INSANEWORKS,LLC](https://www.insaneworks.co.jp/kota/git%E3%81%A7%E7%BD%B2%E5%90%8D%E4%BB%98%E3%81%8Dcommits%E3%82%84tag%E3%82%92%E4%BD%9C%E3%82%8B/)

[^1]: 内容を修正したい場合は、鍵を作り直した上で新しい鍵をGitHubに登録する必要があります。