macOS Sierraで、GitHubにGPG署名付きでコミットできるように設定する。


一緒に仕事をしてる人のコミットの履歴に "Verified" って出ててかっこいいなーと思ったのでやってみました。

![](https://www.evernote.com/l/ABX1DHJYxQNJioTPjR6I6ewuOY4dDerWiQIB/image.png)

GitHubの公式なドキュメントは以下のURLです。

https://help.github.com/articles/generating-a-gpg-key/

しかし、GitHubの公式なガイドを見ながらやっても 「You need a passphrase to unlock the secret key ...」 というエラーが出てうまくいきませんでした。

そこで、 [＠bmhatfield](https://github.com/bmhatfield) さんという方がGistで公開している内容を試したらうまくいきましたので、その方法を紹介します。

https://gist.github.com/bmhatfield/cc21ec0a3a2df963bffa3c1f884b676b

僕の環境は以下の通りです。

* macOS Sierra
* Homebrew 1.0.6
* Git 2.10.1
* gpg 2.0.30

いちど公式なガイド通りにやって見て、同じ現象にでくわしたらこの記事のやりかたを試す感じがいいと思います。

## セットアップ方法

### 必要なライブラリをインストール

```bash
$ brew install gnupg gpg-agent pinentry-mac
```

### GPG 署名を作成する

```bash
$ gpg --gen-key
```

このコマンドを実行するといくつかの項目の入力を求められます。

ここでは注意すべき項目だけ紹介します。

#### キーの長さ

GitHub では、4096を推奨していますので、4096と入力してエンターです。

```bash 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
```

#### メールアドレス等

```bash 
Real name: miya0001
Email address: miya@exmaple.com
Comment: GitHub             
You selected this USER-ID:
    "miya0001 (GitHub) <miya@exmaple.com>"
```

名前、Emailアドレス、コメントの入力が求められます。EmailアドレスはかならずGitHubに登録されているEmailアドレスを入力してください。

https://github.com/settings/emails

その他の項目は任意でいいようです。

パスフレーズの入力を求められますので、これは忘れないようにしましょう。

### gitに署名を設定する

まず、以下のコマンドで、署名のリストを取得してください。

```bash
$ gpg --list-secret-keys --keyid-format LONG
/Users/miyauchi/.gnupg/secring.gpg
----------------------------------
sec   4096R/XXXXXXXXXXXXXXXX 2016-10-07
uid                          miya0001 (GitHub) <miya@example.com>
ssb   4096R/1234567890123456 2016-10-07
```

上の中の `XXXXXXXXXXXXXXXX` という部分が署名のIDです。これを以下のコマンドでGitに登録します。

```bash
$ git config --global user.signingkey XXXXXXXXXXXXXXXX
```

あと、`gpg` コマンドのパスを以下のコマンドで設定します。

```bash
$ git config --global gpg.program $(which gpg)
```

続けて、以下のコマンドで自動的に署名付きでコミットするように設定してください。

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

### GitHubに署名の公開鍵を登録

以下のコマンドで公開鍵を取得してください。 `XXXXXXXXXXXXXXXX` の部分は署名のIDです。

```bash
$ gpg --armor --export XXXXXXXXXXXXXXXX
```

取得した公開鍵をコピーしてGitHubの以下のURLで登録してください。

https://github.com/settings/keys

![](https://www.evernote.com/l/ABUAUBmiYgZFOKwQLtCLF6z1m_fG4Wr4R2EB/image.png)

### gpgの設定

GitHubに書いてあるガイドではここまででなんとかなるみたいな感じだったのですが、最初に書いたようにパスワードを入れてよってエラーが出てしまってうまくいかなかったので、そのための設定を行います。

まず以下の二つのコマンドを連打してください。

```
$ curl https://gist.githubusercontent.com/bmhatfield/cc21ec0a3a2df963bffa3c1f884b676b/raw/893ab10dc8cd4d6c3cc4ce49bd010a20b54ba4e8/gpg.conf > ~/.gnupg/gpg.conf
$ curl https://gist.githubusercontent.com/bmhatfield/cc21ec0a3a2df963bffa3c1f884b676b/raw/893ab10dc8cd4d6c3cc4ce49bd010a20b54ba4e8/gpg-agent.conf > ~/.gnupg/gpg-agent.conf
```

次に、 `~/.bash_profile` 等に以下のコードを追加してください。

https://gist.githubusercontent.com/bmhatfield/cc21ec0a3a2df963bffa3c1f884b676b/raw/893ab10dc8cd4d6c3cc4ce49bd010a20b54ba4e8/.profile

これらのソースは冒頭に紹介した以下のURLにすべてあります。

https://gist.github.com/bmhatfield/cc21ec0a3a2df963bffa3c1f884b676b

### 初コミット

以上が完了したら適当に何かをコミットしてください。すると以下のようなプロンプトが出てパスワードの入力を求められます。

![](https://www.evernote.com/l/ABW0G_KhGKFKrq85YZtzfY1nnQ0v_qms0uMB/image.png)

パスワードは、GPG署名を作成するときに入力したパスワードを入力してください。

「Save in Keychain」にチェックを入れると次回以降パスワードの入力を求められなくなります。

コミットしたらGitHubに `git push` してみましょう。コミットの履歴に以下のように「Verified」と表示されていたら成功です。

![](https://www.evernote.com/l/ABX1DHJYxQNJioTPjR6I6ewuOY4dDerWiQIB/image.png)


### おまけ

ところで、署名付きで一度コミットした後でGitHubに登録した署名の公開鍵を削除したらどうなるのかな？と思って試して見ました。

![](https://www.evernote.com/l/ABUbxhDfnQZIna8WHU_b6Xp1fKP1cO8kdEUB/image.png)

あっ、なるほど。笑

僕はBotを使って定期的にアップデートしてるプロジェクトもあるんですが、そういうのと区別することもできそうですね。