🔐

GitとGPG署名

に公開

はじめに

GitコミットをGPG署名付きで行う場合に遭遇する作業まとめ。

Git

GIT_TRACE=1 GIT_GPG_COMMAND="gpg --pinentry-mode loopback" git commit -S -m "テスト"

GPG

この記事のGPGバージョン

which gpg

/opt/homebrew/bin/gpg

gpg --version

gpg (GnuPG) 2.4.7
libgcrypt 1.11.0
Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/USER_NAME/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2

GPGの概念

  • 秘密鍵:Primary Key
  • 秘密鍵:Subkey
  • パスフレーズ
    • 通常「最初に署名/復号などの操作をしたとき」に要求され、その後キャッシュされる。
  • ロック
    • gpg-agentのキャッシュにパスフレーズを登録する事で起こる。
  • アンロック
    • gpg-agentのキャッシュからパスフレーズを消去する事で起こる。

秘密鍵や秘密サブ鍵

表示例
gpg --list-secret-keys --keyid-format LONG
[keyboxd]
---------
sec   rsa4096/ABCDEF1234567890 2025-04-16 [SC]
      ABCDEF1234567890ABCDEF1234567890ABCDEF12
uid                 [  究極  ] you <you@gmail.com>
ssb   rsa4096/0987654321FEDCBA 2025-04-16 [E]
表示内容の意味
gpg --list-secret-keys --keyid-format LONG

[<ファイルヘッダー>]
---------
<行が秘密鍵を意味>      <アルゴリズムと鍵長>/<秘密鍵> <鍵の生成日> [<鍵の用途フラグ>]
                     < 40 桁フィンガープリント>
<行がUserIDを意味>      [ <信頼度> ] <YOUR NAME> <youremail@domain.com>
<行が秘密サブ鍵を意味>  rsa4096/<秘密サブ鍵> <鍵の生成日> [<鍵の用途フラグ>]

キーグリップ: keygrip

sec   rsa2048 2019-01-01 [SC]
      ABCDEF1234567890ABCDEF1234567890ABCDEF12  ←これがkeygrip
uid           Your Name <you@example.com>

パスフレーズの変更方法

パスフレーズは通常「最初に署名/復号などの操作をしたとき」に要求され、その後キャッシュされる。
パスフレーズを変更することはできるが、古いパスフレーズの入力を求められるので、パスフレーズを忘れた場合は鍵自体を作り直すしかない。

# ターミナルで該当キーを編集モードにする
gpg --edit-key <KEY_ID>

gpg> passwd
# 古いパスフレーズと新しいパスフレーズを入力
gpg> save

鍵の開錠と施錠

キャッシュ TTLを指定する

1. ~/.gnupg/gpg-agent.confに追記

# キャッシュを 1 時間(3600 秒)に設定
default-cache-ttl 3600
# 最大キャッシュ時間を 1 日(86400 秒)に設定
max-cache-ttl 86400

2. 再読み込み

gpgconf --reload gpg-agent

手動で開錠、施錠 gpg-preset-passphrase

# 秘密鍵一覧と keygrip を表示
gpg --with-keygrip -K
sec   rsa2048 2019-01-01 [SC]
      ABCDEF1234567890ABCDEF1234567890ABCDEF12  ← これが keygrip
uid           Your Name <you@example.com>


# アンロック(キャッシュ登録)
# keygrip 部分を自分のものに置き換えてください
echo -n "your_passphrase" | \
  gpg-preset-passphrase --preset --passphrase-fd 0 ABCDEF1234567890ABCDEF1234567890ABCDEF12


# ロック(キャッシュ消去)
gpg-preset-passphrase --forget ABCDEF1234567890ABCDEF1234567890ABCDEF12

手動で開錠、施錠 gpg-connect-agent

# 秘密鍵一覧と keygrip を表示
gpg --with-keygrip -K
sec   rsa2048 2019-01-01 [SC]
      ABCDEF1234567890ABCDEF1234567890ABCDEF12  ← これが keygrip
uid           Your Name <you@example.com>


# アンロック
gpg-connect-agent <<EOF
PRESET_PASSPHRASE --passphrase your_passphrase ABCDEF1234567890ABCDEF1234567890ABCDEF12
EOF

# ロック
gpg-connect-agent <<EOF
FORGET_PASSPHRASE ABCDEF1234567890ABCDEF1234567890ABCDEF12
EOF

現在のキャッシュ時間を確認する

gpg-connect-agent 'keyinfo --list' /bye

整理中

# 秘密鍵の一覧表示
gpg --list-secret-keys --keyid-format LONG

# 対象キーの信頼度を変更
gpg --edit-key <KEY_ID>

gpg --fingerprint --fingerprint <NAME>

# pgp-agentのリロード
gpgconf --reload gpg-agent

Discussion