Keybaseに登録した鍵を使ってmacOSでgitの署名付きcommitをする(実践記録)

# はじめに
どうも‪✋(´･ᴗ･\` )‬
題名の通り, 署名付きcommitをKeybaseとともにやりましょうというお話です。

[Keybase の鍵で GitHub のコミットに Verified バッジをつける - Qiita](https://qiita.com/7ma7X/items/bcb0246b42d12195c6d0)
基本的には上記の記事の実践記録になります。
書かれている手順を実施しながら, 私みたいな初学者向けに設定の根拠等を自分なりに調べたのでそれをまとめてみました。

# 手順
## Keybaseのインストール
Keybaseを使って鍵の管理をしたいので, インストールしていなければインストールしておきます。
公式サイトからインストーラーをダウンロードしてインストールしてください。
[The App - Install Macos | Keybase Docs](https://keybase.io/docs/the_app/install_macos)

## GPG_TTYの設定
この後で使用するGnuPGというソフトウェアに使っているシェルの場所を教えるために, 下記の手順で環境変数 `GPG_TTY` を設定します。
これを設定しないとGnuPGがどのシェルから入力を読み取ったら良いかわからず, `Inappropriate ioctl for device` というエラーが出てしまいます。

① .zshrc 等, 利用しているシェルの設定ファイルを開きます。
② 下記を追加します。

```zsh
GPG_TTY=$(tty)
export GPG_TTY
```

③ 設定ファイルを再読み込みします

```zsh
$ source .zshrc
```

## 必要なソフトウェアのインストール
① 下記のコマンドを実行し, GnuPGとpinentry-macをインストールします。
GnuPGは暗号化ソフト, pinentry-macは秘密鍵のパスフレーズを入力する際に使用するソフトです。

```zsh
$ brew install gnupg pinentry-mac
```

② GnuPGの設定ファイルを格納するフォルダを作成します。

```zsh
$ mkdir ~/.gnupg
```

③ 下記のコマンドを実行して `~/.gnupg` 配下の設定ファイルに設定値を書き込み, GnuPGにpinentry-macの場所を教えてあげます

```zsh
$ echo "pinentry-program `which pinentry-mac`" > ~/.gnupg/gpg-agent.conf
```

④ GPG Agentを再起動します。

```zsh
$ gpgconf --kill gpg-agent
```

## Keybaseから鍵をインポート
① Keybaseから公開鍵をエクスポートし, それをGnuPGにインポートします。

```zsh
$ keybase pgp export | gpg --import
```

② Keybaseから秘密鍵をエクスポートし, それをGnuPGにインポートします。
秘密鍵のパスフレーズを訊かれたら適宜設定します。

```zsh
$ keybase pgp export --secret | gpg --allow-secret-key --import
```
![スクリーンショット 2019-11-16 19.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/9af3b320-5631-69d7-5b1f-b3ecccbc3e0c.png)

こんな感じの表示が出ればOKです。

```
gpg: 鍵****************:"Ray Nanamiya <****@***.***>"変更なし

gpg: 鍵4F7AF2B0AF315E05: 秘密鍵をインポートしました
gpg:           処理数の合計: 1
gpg:               変更なし: 1
gpg:       秘密鍵の読み込み: 1
gpg:     秘密鍵のインポート: 1
```

## github.comに公開鍵情報を登録する
まだgithub.comに公開鍵情報を登録していなければ登録します。

① 公開鍵をコピーするために, Keybaseの自身のプロフィールページに行き, ここをクリックします。
<img width="936" alt="スクリーンショット 2019-11-22 14.31.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/4bdaf5d7-d094-d9eb-309e-3c2e929fab22.png">

② ここに表示されている文字列をコピーします。
<img width="478" alt="スクリーンショット 2019-11-22 14.31.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/a2978ef6-6d25-9694-0d45-28a92aeeedd5.png">

③ Githubの自身のプロフィールページにアクセスし, 画面右上のSettingsをクリックします。
<img width="168" alt="スクリーンショット 2019-11-22 14.32.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/81d424ca-d92c-217e-5a3e-d356b250072a.png">

④ 「New GPG Key」をクリックしてコピーしたGPGキーを登録します。
<img width="616" alt="スクリーンショット 2019-11-22 17.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/24b1edcd-fdc7-5dff-d275-c33dd0080fad.png">

## gitの設定
最後に, 必要な設定をgitに入れ込みます。

### 鍵情報の登録
① 下記のコマンドを実行して鍵情報を確認します。
この時, メールアドレスがgitにcommitする時のメールアドレスと一致していないといけませんのでご注意ください。

```zsh
$ gpg --list-secret-keys
```

```
gpg: *警告*: homedir '/Users/***/.gnupg'の安全でない許可
/Users/***/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096 2019-09-29 [SC] [有効期限: 2035-09-25]
      E474************************************
uid           [  不明  ] Ray Nanamiya <***@***.***>
ssb   rsa4096 2019-09-29 [E] [有効期限: 2035-09-25]
```

② E474から始まる文字列をgitに登録します。

```zsh
$ git config --global user.signingkey E474************************************
```

### GnuPGのパス設定
① 下記のコマンドを実行してgitにGnuPGの場所を教えてあげます。

```zsh
$ git config --global gpg.program `which gpg`
```

# 最後に
以上の手順を踏めばGPGキーで署名したコミットをすることができるようになります。
署名つきコミットをする場合は

```zsh
$ git commit -S -m "***"
```

のように `-S` オプションを利用します。

# 参考資料
- [gpg-agent forwarding: inappropriate ioctl for device - Stack Overflow](https://stackoverflow.com/questions/51504367/gpg-agent-forwarding-inappropriate-ioctl-for-device)
- [Keybase の鍵で GitHub のコミットに Verified バッジをつける - Qiita](https://qiita.com/7ma7X/items/bcb0246b42d12195c6d0)
- [gpg: signing failed: Inappropriate ioctl for device · Issue #2798 · keybase/keybase-issues](https://github.com/keybase/keybase-issues/issues/2798)