GitコミットにGPG署名を適用し、GitHubに公開鍵を登録してVerifiedバッジを受け取る過程を表した画像

概要

GitコミットにGPGデジタル署名を追加することで、コミット作成者の身元を証明し、コードの完全性を保証できます。

このドキュメントでは、GPGの概念とGitでの活用方法を紹介します。

GPGキーの生成からGitの設定、GitHubとの連携まで、全体の手順を段階的に案内します。

GPGとは?

GPG(GNU Privacy Guard)は、データ暗号化とデジタル署名のためのオープンソース暗号化ソフトウェアです。

PGP(Pretty Good Privacy)標準に従い、公開鍵暗号方式を使用します。

主な特徴

  • 公開鍵暗号化: 公開鍵と秘密鍵のペアでデータを暗号化・復号します。
  • デジタル署名: 秘密鍵でデータに署名します。作成者の身元とデータの完全性を保証します。
  • セキュアな通信: メールやファイルなどを安全に暗号化して送信できます。

GitとGPG

GitでGPGはコミットやタグにデジタル署名を追加する際に使用します。

  • コミットが実際に本人によって作成されたことを証明できます。
  • GitHubやGitLabなどのプラットフォームでVerifiedバッジを表示し、信頼性を高めます。
  • コードの改ざんや偽造を防ぎ、プロジェクトのセキュリティを強化します。
  • ファイルを暗号化して保護します。

Gitコミットに署名する理由

Gitコミットの作成者情報は、git config user.nameuser.emailで誰でも任意に設定できます。

そのため、名前とメールアドレスだけでは実際の作成者を信頼することが難しいです。

コミット前に秘密鍵でコミットに署名し、公開鍵をGitHubなどのリポジトリに登録することで、プラットフォームが署名を検証してコミット作成者が一致するかどうかを確認できます。

GPGを使う

gnupgのインストール

gnupg: GPGを使用するためのパッケージのインストール(例:Mac)

1brew install gnupg

キーの生成

gpg --full-generate-keyはデフォルトで対話型モードで動作します。バッチモードもオプションとしてサポートされています。

1gpg --full-generate-key

Please select what kind of key you want: (1) RSA and RSA (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) (9) ECC (sign and encrypt) default (10) ECC (sign only) (14) Existing key from card Your selection? 1

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

Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 1y

Key is valid for? (0) 1y Key expires at 2027년 2월 16일 화요일 17시 14분 10초 KST Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: your name Email address: your [email protected] Not a valid email address Email address: [email protected] Comment: test You selected this USER-ID: “your name (test) [email protected]

gpg –full-generate-keyで鍵を生成するターミナル画面

キー生成の確認

1# 秘密鍵の一覧
2gpg --list-secret-keys
3
4# 公開鍵の一覧
5gpg --list-keys

その他の必要な機能

キーの削除が必要な場合
1# 秘密鍵の削除
2gpg --delete-secret-keys {sec uuid}
3
4# 公開鍵の削除
5gpg --delete-keys {pub uuid}
キーのエクスポート
1# 秘密鍵のエクスポート
2# gpg --armor --export-secret-keys {key_id} > private.asc
3gpg --armor --export-secret-keys 7XXXXXXXXXXXXXXXX6 > private.asc
4
5# 公開鍵のエクスポート
6# gpg --armor --export {key_id} > public.asc
7gpg --armor --export 7XXXXXXXXXXXXXXXX6 > public.asc
キーの復元
1#
2gpg --import private.asc
3
4# trustの指定
5# gpg --edit-key {key_id}
6gpg --edit-key 7XXXXXXXXXXXXXXXX6
7
8# 登録確認
9gpg --list-secret-keys --keyid-format LONG

(参考)トラブルシューティング

エラー: パスフレーズ(キーの暗号)を使わないようにしようとしました。キー生成の途中でパスワード入力画面に戻りました。

原因

  • 最新バージョンではキー漏洩のセキュリティリスクから、キーのパスフレーズ使用を強く推奨しています。
  • バッチモードなどで回避する方法はありますが、それでも短くてもパスフレーズを設定する方が安全です。

解決:パスフレーズを設定しました。

Gitでの署名

コミットする際は、GitHubに登録したGPG公開鍵と紐づいた秘密鍵で署名する必要があります。

その後、GitHubは署名されたコミットがプッシュされるとコミット作成者を検証します。

GitHubのコミットに「Verified」バッジも一緒に表示されます。

GitでGPG署名の準備

以下のA、B、Cの方式から一つを選択します。

オプション A) 手動署名(コミットごとに -S

自動設定なしで、署名したいコミットにだけ -S を付けます。
1git commit -S -m "Commit message"

オプション B) グローバル自動署名(すべてのリポジトリ)

ローカル環境で作るすべてのリポジトリに自動署名を有効にします。
1# GPGキーIDを登録(グローバル)
2git config --global user.signingkey 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6
3
4# コミット自動署名(グローバル)
5git config --global commit.gpgsign true
6
7# 設定確認
8git config --show-origin commit.gpgsign

オプション C) リポジトリ単位の自動署名(特定のリポジトリのみ)

特定のリポジトリでのみ自動署名を有効にします。
  • --globalはすべてのリポジトリに適用します。
  • --localは現在のリポジトリにのみ適用します。設定は.git/configに保存されます。
 1# リポジトリに移動
 2cd /path/to/repo
 3
 4# GPGキーIDを登録(ローカル)
 5git config --local user.signingkey 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6
 6
 7# コミット自動署名(ローカル)
 8git config --local commit.gpgsign true
 9
10# 設定確認
11git config --show-origin commit.gpgsign

GPGで署名されたコミットの作成

コミット時に -S オプションを使用して署名を追加します。

1# 署名されたコミットを作成
2git commit -S -m "コミットメッセージ"
3
4# 自動署名が設定されている場合
5git commit -m "コミットメッセージ"

署名確認:コミットが正しく署名されているか確認します。

1# コミット署名の確認
2git log --show-signature
3
4# または
5git verify-commit HEAD

(参考)トラブルシューティング

error: gpg failed to sign the data

署名の問題でコミットが失敗しました。

1**error: gpg failed to sign the data:**
2[GNUPG:] KEY_CONSIDERED 7E7DCEBF62463A41ACD992D8D9F62FE2379DF7E6 2
3[GNUPG:] BEGIN_SIGNING H8
4[GNUPG:] PINENTRY_LAUNCHED 42114 curses 1.3.2 - xterm-256color NONE - 501/20 0
5gpg: signing failed: Inappropriate ioctl for device
6[GNUPG:] FAILURE sign 83918950
7gpg: signing failed: Inappropriate ioctl for device
8**fatal: failed to write commit object**

原因: GPGキーにパスフレーズが設定されている状態で発生することがあります。

解決: OSと環境によって対処方法が異なります。Mac環境ではpinentry-macをインストールして解決しました。

  1. パッケージのインストール brew install pinentry-mac
  2. ~/.gnupg/gpg-agent.conf に以下の内容を追加します。 pinentry-program /opt/homebrew/bin/pinentry-mac
  3. ~/.profile に以下の内容を追加します。 export GPG_TTY=$(tty)
  4. プロファイルを再読み込みします。 source ~/.profile
  5. gpg agentを再起動 gpgconf --kill gpg-agent gpgconf --launch gpg-agent
  6. 再度コミット:パスフレーズ入力ウィンドウが表示されます

pinentry-mac設定後、コミット時にGPGパスフレーズ入力画面が表示される画面

GitHubでの署名

GitHubとGPG

GitHubにGPG公開鍵を登録することで、コミット署名を検証できます。

GitHubはプッシュされたコミットの署名を確認する際、登録されたGPG公開鍵を使って署名が有効かどうかを検証します。

検証が成功するとコミットの横に「Verified」バッジが表示され、そのコミットが登録されたキーの所有者によって作成されたことを証明します。

これにより以下のメリットが得られます:

  • 身元確認: コミット作成者が実際に本人であることを証明します。
  • 改ざん防止: 他人が自分の名前でコミットを作成することを防ぎます。
  • 信頼性向上: オープンソースプロジェクトやチーム協業でコードの出所を明確にします。

登録手順

GPG公開鍵をGitHubの個人設定の GPG keys セクションに登録します。

  • GitHubにログインし、右上のプロフィールアイコンをクリックします。
  • Settingsを選択します。
  • 左サイドバーで SSH and GPG keys をクリックします。
  • GPG keys セクションで New GPG key ボタンをクリックします。
  • 公開鍵の全内容をコピーして入力欄に貼り付けます。
  • Add GPG key ボタンをクリックして登録を完了します。

登録が完了するとGPG Keysのリストに新しいキーが表示されます。

個人のGPG公開鍵の照会

1gpg --list-secret-keys --keyid-format LONG

結果

[keyboxd]

—-

pub rsa4096 2026-02-16 [SC] [expires: 2027-02-16] 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6 ← {Key ID} uid [ultimate] Son Won Chul (plzhans’s macbook) [email protected] sub rsa4096 2026-02-16 [E] [expires: 2027-02-16] ← キーの有効期限

キーの内容を確認します。

1# キーの閲覧: gpg --armor --export {Key ID}
2gpg --armor --export 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6

GitHub GPGキーの登録

GitHub設定のSSH and GPG keysでNew GPG keyから公開鍵を登録する画面

GitコミットにGPG署名を適用し、GitHubに公開鍵を登録してVerifiedバッジを受け取る過程を表した画像

リポジトリへのプッシュ

署名されたコミットをGitHubにプッシュすると「Verified」バッジが表示されます。

1git push origin main

署名されたコミットとタグの確認

プッシュしたコミットにVerifiedバッジが表示された画面

関連記事