🔐
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