WinHacks: Windows で GnuPG による署名付きコミットを確実に実現する設定方法
はじめに
atsushifx です。
この記事では、開発環境で GnuPG を用いた署名付きコミットを設定する手順を説明します。
Git の設定によって署名付きコミットが失敗する問題とその対処法についても説明します。
技術用語
この記事で使用される、主要な技術用語について解説します。
-
GnuPG:
GNUプロジェクトが開発した、公開鍵暗号方式によるデータ暗号化と電子署名のためのオープンソースツール -
Gpg4win:
Windows 向けにGUIツール、暗号化ツール、証明書管理ツールを含んだ、総合GnuPGパッケージ -
Git:
分散型バージョン管理システム -
署名付きコミット:
Gitで開発者が電子署名を付与し、改ざん防止と認証をするためのコミット手法 -
GNUPGHOME:
GnuPGの設定ファイルを格納するディレクトリを指定する環境変数
1. GnuPGのインストールと設定
Windows 環境でのGnuPGのインストールと設定方法を解説します。
環境変数の設定、Gpg4winのインストール、システムPathへの追加、設定ファイルの作成およびリンクを設定し、シェル上での動作環境を整えます。
1.1 環境変数GNUPGHOMEの設定
通常、GnuPG の設定ファイルは ${USERPROFILE}/.gnupg に配置されます。
これを、Windows の既定の設定ディレクトリ ~/AppData/Roaming内に配置するため、環境変数 GNUPGHOME を設定します。
以下のコマンドで、環境変数を設定します。
[System.Environment]::SetEnvironmentVariable("GNUPGHOME", "${env:AppData}\gnupg", "User")
以上で、User環境変数にGNUPGHOMEが設定されるので、Windows Terminalを再起動し、設定を反映させます。
以下のコマンドを実行し、環境変数を確認します。
echo $env:GNUPGHOME
C:\Users\<ユーザー名>\AppData\Roaming\gnupg
上記のように、AppData\Roamingとなっていれば正常に設定されています。
1.2 Gpg4winのインストール
wingetを使ってGpg4winをインストールします。次のコマンドを実行します。
winget install GnuPG.Gpg4win --interactive --location "C:\app\develop\utils\gpg4win"
このとき、GnuPGパッケージも一緒にインストールされ、c:\app\develop\utils\gnupg には gpgバイナリが配置されます。
c:\app\develop\utils\gpg4win には Windows用クライアント がインストールされます。
1.3 システムPathへの追加
システムPathにディレクトリを追加し、シェル上からgpg.exeを実行できるようにします。
-
C:\app\develop\utils\gnupg\bin(gpgおよぼ各種バイナリ) -
C:\app\develop\utils\gpg4win\bin(Windows用クライアント)
の 2つです。
以下のシェルスクリプトを実行し、パスを追加します。
インストール時に追加された C:\app\develop\utils\gpg4win\..\gnupg\bin は、必要がなくなったので削除しておきます。
Windows Terminal を再起動し、編集後の Path をシェルに反映させます。
これで、PowerShell上で gpg が使用できます。
1.4 設定ファイル (gpg.conf等) の作成
GnuPGの動作を定義する設定ファイルを作成します。
これらはdotfilesリポジトリで管理するため、${XDG_CONFIG_HOME}/gnupg下に設定ファイルを作成し、${GNUPGHOME}下にシンボリックリンクします。
-
設定ファイルを作成する。
-
gpg.conf: -
gpg_agent.conf: -
dirmngr.conf:
-
-
インストールスクリプトを実行する。
これにより、${GNUPGHOME}配下に設定ファイルのシンボリックリンクが作成され、GnuPGが設定を参照できるようになります。
2. 署名付きコミットの実現
この章では、GitHub に署名付きコミットをするための手順を説明します。
2.1 Git用GPG鍵の作成
署名をするために、GnuPGでGPG鍵を作成する必要があります。
Windows Terminalでgpg --full-generate-keyを実行し、対話形式でGPG鍵を作成できます。
詳しい方法は、GPGチートシート を参照してください。
今回のGPG鍵の設定項目は、次のようになります。
| 設定項目 | 設定 | 説明 | 備考 |
|---|---|---|---|
| 有効期限 | 3y | 鍵の有効期限を3年に設定 | 期限が切れた後に更新が必要 |
| 本名 | [Your Name] | 鍵の所有者名 |
GitHubのプロフィール名と同じにするのを推奨 |
| 電子メールアドレス | [Your Email] | 鍵に関連つけるメールアドレス |
GitHubに登録されたメールアドレスと同一にする |
| パスフレーズ | [Your Pass phrase] | 鍵を保護するためのパスフレーズ | セキュリティのため、推測されにくいものを設定 |
上記以外の質問は、デフォルト設定のままとします。
作成したGPG鍵は、以下のコマンドで確認ができます。
gpg --list-keys --keyid-format=long
[keyboxd]
---------
pub ed25519/CF658DD4B12C3FE5 2025-02-20 [SC] [有効期限: 2028-02-20]
EA13413644F0FF3BE792A291CF658DD4B12C3FE5
uid [ 究極 ] Furukawa Atsushi <atsushifx@gmail.com>
sub cv25519/30D808FC247E1BAF 2025-02-20 [E] [有効期限: 2028-02-20]
上記のような表示がされていれば、鍵が正常に作成されています。
2.2 Gitのグローバル設定
作成したGPG鍵で署名付きコミットをするために、Gitのグローバル設定を変更します。
Gitのグローバル設定 (${XDG_CONFIG_HOME}/git/config) に、以下の設定を追加します。
-
GitHubで認証済みのメールアドレスを指定しない場合、verifiedと認識されません。 -
gpg.exeは正しいフルパスを指定しないと、エラー発生の可能性があります。
[commit]
gpgsign = true # GPGで署名する
[user]
signingkey = <GitHubに認証済みのメールアドレス> # `GitHub` で `verified` として認識されるために必要
[gpg]
program = "C:\app\develop\utils\gnupg\bin\gpg.exe" # 署名に使用する`GnuPG`
上記のように設定することで、コミット時に自動的にGnuPGの署名が有効になります。
コミット時には、以下のダイアログが表示されます。

パスフレーズ入力
正しいパスフレーズを入れてコミットすると、署名付きコミットになります。
2.3 GitHubへの公開鍵登録
GitHubに上記のGPG鍵を登録することで、GitHub上のコミットが認証済み (verified) となります。
これにより、自分の GitHubリポジトリ の信頼性を高めることができます。
以下の手順で、GPG鍵を登録します。
-
鍵IDの確認:
次のコマンドで、GPG鍵を確認します。gpg --list-keys --keyid-format=long [keyboxd] --------- pub ed25519/CF658DD4B12C3FE5 2025-02-20 [SC] [有効期限: 2028-02-20] EA13413644F0FF3BE792A291CF658DD4B12C3FE5 uid [ 究極 ] Furukawa Atsushi <atsushifx@gmail.com> sub cv25519/30D808FC247E1BAF 2025-02-20 [E] [有効期限: 2028-02-20]pubキーの後に表示されるed25519/CF658DD4B12C3FE5の後ろ 16桁の英数字が鍵IDとなります。 -
公開鍵の出力:
次のコマンドで、公開鍵を出力します。鍵IDは 1. で確認したものを使用します。
鍵の出力後、typeコマンドで公開鍵が適切に出力されているかを確認します。gpg --armor --export CF658DD4B12C3FE5 --output public-key.asc type public-key.asc作成されたファイルは、
-----BEGIN PGP PUBLIC KEY BLOCK----- abcdxxxx . . -----END PGP PUBLIC KEY BLOCK-----という形式になっています。
-
GitHubにアクセス:
GitHub - SSH and GPG keysにアクセスします。
GitHubからは、[右上のアイコン]-[Settings]を開き、左サイドのメニューで[SSH and GPG keys]を選択します。
SSH and GPG keys -
公開鍵の貼り付け:
[New GPG Key]をクリックし、タイトルを入力した後、公開鍵 (public-key.ascの内容) を貼り付けて[Add GPG key]をクリックします。
Add new GPG key
以上で公開鍵の登録は完了です。
登録後は、GitHub上のコミットが認証済みとなります。
3. トラブルシューティング
この章では、GnuPGに関する簡単なトラブルシューティングを載せておきます。
[TB-0001]: gpg: invalid size of lockfile
invalid size of lockfileエラーが表示される場合、パスに空白が含まれている可能性があります。
検索パスにProgram Files など空白を含むパスがあると、同様のエラーが発生します。
git/configのgpg.programには、フルパスを指定し、"で囲んでください。
# エラー発生: 検索パス、実行時パスに空白が含まれている可能性がある
program = gpg.exe
# 解決策、フルパスで指定し、'"'で囲む
program = "C:\app\develop\utils\gnupg\bin\gpg.exe"
おわりに
今回の記事では、Windows環境で GnuPG を使用して署名付きコミットをするための手順を説明しました。
Gpg4win のインストール、Git の設定、GitHub への公開鍵登録を順に行なうことで、署名付きコミットの環境を構築できるようになります。
署名付きコミットを導入することで、開発者のなりすましを防ぎ、プロジェクトの信頼性を向上できます。
特にOSSやチーム開発においては、コミットの正当性を保証することが重要です。
署名付きコミットを導入し、より安全で確実な開発環境を構築しましょう。
それでは、Happy Hacking!
参考資料
Webサイト
-
GPGチートシート:
GnuPGでよく使うコマンドの解説。鍵の作成、共有方法など -
Gitのさまざまなツール - 作業内容への署名:
Gitでコミットなどに署名をする方法 -
GitHub- コミット署名の検証を管理する:
GitHubにて、コミットが認証済みかどうかを管理する方法
Discussion