keybaseでGPGを管理してgit commitに署名する方法

## はじめに

Keybase.ioは、暗号化とアイデンティティ検証のためのオープンソース(一部)のサービスです。以下がKeybase.ioの主な特徴です：

エンドツーエンドの暗号化: メッセージング、ファイル共有、チームコラボレーションなどを安全に行えます。
アイデンティティ検証: ソーシャルメディアアカウント、ウェブサイト、暗号通貨アドレスなどを公開鍵に紐付けることで、オンラインアイデンティティを証明できます。
分散型公開鍵ディレクトリ: ユーザーの公開鍵を簡単に検索・取得できます。
クロスプラットフォーム: デスクトップ、モバイル、ウェブなど、様々なプラットフォームで利用可能です。
GPG/PGPとの統合: 既存のGPG/PGPエコシステムと互換性があり、それらのキーを簡単に管理できます。


Keybase.ioを利用することで、GPGキーの作成と管理が簡素化され、さらにオンラインでの身元証明も容易になります。これは、オープンソースプロジェクトやチーム開発において、コードの信頼性を高める上で非常に有効です。


GitHubでコミットに署名することは、コードの信頼性と安全性を高める重要な手段です。この記事では、Keybase.ioを使用してGPGキーを作成し、ローカルのGPGセットアップに追加して、GitとGitHubで使用する方法を解説します。

:::note info
なぜGitのコミットに署名が必要なのか？
Gitのコミットに署名をつけないことで、以下のような脆弱性が生じる可能性があります：

なりすましの危険性：

GitHubでは、ユーザー名とメールアドレスを自由に設定できます。つまり、誰でも他人のふりをしてコミットを作成できてしまいます。
例：悪意のある人が「Linus Torvalds <torvalds@linux-foundation.org>」と設定してコミットすれば、一見するとLinusがコミットしたように見えます。


コードの信頼性の低下：

署名のないコミットは、本当に主張している人物が行ったものかどうか確証が持てません。
これは、オープンソースプロジェクトやセキュリティに敏感なプロジェクトで特に問題になります。


履歴の改ざん：

Gitの履歴は変更可能です。署名がないと、誰かが過去のコミットを変更しても、それを検出するのが難しくなります。


セキュリティ監査の困難：

コードの変更履歴を追跡する際、各変更が本当に主張している人物によるものか確認できないと、セキュリティ監査が困難になります。


法的・コンプライアンス上の問題：

ソフトウェアの著作権や、コントリビューターの同意を確認する際、署名のないコミットは法的な証拠として弱い可能性があります。
:::


署名付きコミットを使用することで、これらの問題を大幅に軽減できます。署名は、コミットが確かに主張している人物によって行われたことを暗号学的に証明します。これにより、コードの信頼性が向上し、プロジェクトの安全性が高まります。

## 前提条件

まず、必要なツールをインストールします。macOSを使用している場合は、以下のコマンドでインストールできます：

```shell
brew install gpg
brew install --cask keybase
```

また、Keybaseのアカウントを持っており、ローカルで`keybase login`コマンドでログインできている必要があります。

Gitのバージョンが2.0以上であることを確認してください。古い場合は、`brew install git`でアップデートできます。

## 手順

### 1. Keybase.ioで新しいGPGキーを作成する

```shell
keybase pgp gen --multi
```

プロンプトに従って、名前とメールアドレスを入力します。

### 2. Gitの設定を行う

作成したGPGキーをGitの設定に追加します：

```shell
gpg --list-secret-keys --keyid-format LONG
git config --global user.signingkey [あなたのキーID]
git config --global commit.gpgsign true
```

### 3. GitHubに公開GPGキーを追加する

```shell
keybase pgp export -q [あなたのキーID] | pbcopy
```

このコマンドで公開キーをクリップボードにコピーします。GitHubの設定ページで新しいGPGキーを追加し、コピーしたキーを貼り付けます。

### 5. トラブルシューティング

署名に問題がある場合は、以下のコマンドで原因を特定できます：

```shell
echo "test" | gpg --clearsign
```

### 6. オプション：デフォルトGPGキーの設定

`~/.gnupg/gpg.conf`ファイルに以下の行を追加します：

```
default-key [あなたのキーID]
```

### 7. パスフレーズの記憶（オプション）

毎回パスフレーズを入力したくない場合、gpg-agentとpinentry-macを使用できます：

```shell
brew install pinentry-mac
```

`~/.gnupg/gpg-agent.conf`に以下を追加：

```
pinentry-program /usr/local/bin/pinentry-mac
```

## トラブルシューティング：「Inappropriate ioctl for device」エラー

GPGを使用してコミットに署名しようとしたときに、次のようなエラーが発生することがあります：

```
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
```

このエラーは通常、GPGがttyデバイスにアクセスできない場合に発生します。以下の手順で解決できる場合があります：

### 1. GPG_TTY環境変数の設定

シェルの設定ファイル（.zshrcや.bash_profile）に以下の行を追加します：

```shell
echo 'export GPG_TTY=$(tty)' >> ~/.zshrc
source ~/.zshrc
```

### 2. gpg-agentの再起動

gpg-agentを再起動します：

```shell
gpgconf --kill gpg-agent
gpg-agent --daemon
```

### 3. --no-ttyオプションの使用

それでも問題が解決しない場合は、`--no-tty`オプションを使用してみてください：

```shell
echo "test" | gpg --clearsign --no-tty
```

### 4. ピンエントリーの確認

macOSを使用している場合、ピンエントリープログラムが正しく設定されているか確認します。`~/.gnupg/gpg-agent.conf`ファイルに以下の行があることを確認してください：

```
pinentry-program /usr/local/bin/pinentry-mac
```

### 5. GPGのバージョン確認

GPGのバージョンが最新であることを確認します：

```shell
gpg --version
```

古い場合は、パッケージマネージャーを使用して更新してください。

これらの手順を試しても問題が解決しない場合は、システムの設定やGPGのインストール状況によって異なる対処が必要かもしれません。その場合は、GPGやKeybaseのコミュニティフォーラムで詳細な支援を求めることをお勧めします。

## まとめ

KeybaseとGPGを使用してGitHubでの署名付きコミットを設定することで、コードの信頼性と安全性を高めることができます。この記事で説明した手順に従うことで、スムーズに設定を完了できるはずです。

しかし、技術的な問題に遭遇することもあります。そのような場合は、この記事のトラブルシューティングセクションを参照してください。ほとんどの一般的な問題は、ここで説明した方法で解決できるはずです。

セキュリティを重視する開発者にとって、署名付きコミットは非常に重要なプラクティスです。少し手間がかかりますが、その価値は十分にあります。ぜひ試してみてください！