🔧

WinHacks: Windows で GnuPG による署名付きコミットを確実に実現する設定方法

2025/02/25に公開

はじめに

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}下にシンボリックリンクします。

  1. 設定ファイルを作成する。

    • gpg.conf:

    • gpg_agent.conf:

    • dirmngr.conf:

  2. インストールスクリプトを実行する。

これにより、${GNUPGHOME}配下に設定ファイルのシンボリックリンクが作成され、GnuPGが設定を参照できるようになります。

2. 署名付きコミットの実現

この章では、GitHub に署名付きコミットをするための手順を説明します。

2.1 GitGPG鍵の作成

署名をするために、GnuPGGPG鍵を作成する必要があります。
Windows Terminalgpg --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は正しいフルパスを指定しないと、エラー発生の可能性があります。
${XDG_CONFIG_HOME}/git/config
[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鍵を登録します。

  1. 鍵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となります。

  2. 公開鍵の出力:
    次のコマンドで、公開鍵を出力します。鍵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-----
    

    という形式になっています。

  3. GitHubにアクセス:
    GitHub - SSH and GPG keys にアクセスします。
    GitHub からは、[右上のアイコン]-[Settings]を開き、左サイドのメニューで[SSH and GPG keys]を選択します。

    SSH and GPG keys
    SSH and GPG keys

  4. 公開鍵の貼り付け:
    [New GPG Key]をクリックし、タイトルを入力した後、公開鍵 (public-key.ascの内容) を貼り付けて[Add GPG key]をクリックします。

    Add new GPG key
    Add new GPG key

以上で公開鍵の登録は完了です。
登録後は、GitHub上のコミットが認証済みとなります。

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

この章では、GnuPGに関する簡単なトラブルシューティングを載せておきます。

[TB-0001]: gpg: invalid size of lockfile

invalid size of lockfileエラーが表示される場合、パスに空白が含まれている可能性があります。
検索パスにProgram Files など空白を含むパスがあると、同様のエラーが発生します。

git/configgpg.programには、フルパスを指定し、"で囲んでください。

# エラー発生: 検索パス、実行時パスに空白が含まれている可能性がある
program = gpg.exe

# 解決策、フルパスで指定し、'"'で囲む
program = "C:\app\develop\utils\gnupg\bin\gpg.exe"

おわりに

今回の記事では、Windows環境で GnuPG を使用して署名付きコミットをするための手順を説明しました。
Gpg4win のインストール、Git の設定、GitHub への公開鍵登録を順に行なうことで、署名付きコミットの環境を構築できるようになります。

署名付きコミットを導入することで、開発者のなりすましを防ぎ、プロジェクトの信頼性を向上できます。
特にOSSやチーム開発においては、コミットの正当性を保証することが重要です。
署名付きコミットを導入し、より安全で確実な開発環境を構築しましょう。

それでは、Happy Hacking!

参考資料

Webサイト

GitHubで編集を提案

Discussion