名称: gpg-签名 描述: GPG提交签名的全面指南。设置、配置和故障排除GPG提交签名。修复GPG签名错误,配置密码缓存,验证提交签名。适用于处理Git提交签名、GPG密钥、提交验证、签名验证、GPG配置或遇到GPG签名错误时。涵盖Windows(Gpg4win)、macOS(GPG Suite)、Linux(gnupg)和WSL安装和设置。 允许工具: Read, Bash, Glob, Grep
Git GPG 签名
为所有平台提供设置、配置和故障排除GPG提交签名的全面指导。
目录
概述
Git提交签名提供加密证明,表明提交来自您。此技能帮助您:
- 在Windows、macOS和Linux上安装和配置GPG工具
- 使用正确的密钥管理设置提交签名
- 配置密码缓存以优化工作流程
- 故障排除常见GPG签名问题
- 理解安全权衡和最佳实践
何时使用此技能
此技能应在以下情况下使用:
- 首次设置GPG提交签名
- 配置GPG工具(Gpg4win、GPG Suite、gnupg)
- 故障排除GPG签名错误(“gpg: signing failed”、“inappropriate ioctl”等)
- 故障排除keyboxd守护进程启动问题(Windows竞争条件)
- 确定Git正在使用哪个GPG安装
- 理解Windows守护进程启动行为与官方设计
- 配置密码缓存以减少提示
- 理解GPG vs SSH vs S/MIME签名方法
- 将GPG密钥添加到GitHub/GitLab/Bitbucket
- 解决GitHub上的“未验证”提交
- 处理
.gnupg/gpg-agent.conf配置
快速开始
基本设置(单个个人密钥):
# 1. 安装GPG(见下方平台特定设置)
# 2. 生成密钥
gpg --full-generate-key
# 选择:(9) ECC(签名和加密)→ Curve 25519
# 过期时间:0(无过期)
# 密码:强20+字符密码
# 3. 获取密钥ID
gpg --list-secret-keys --keyid-format=long
# 查找“sec ed25519/<密钥ID>”
# 4. 配置Git
git config --global user.signingkey <密钥ID>
git config --global commit.gpgsign true
# 5. 导出公钥并添加到GitHub
gpg --armor --export <密钥ID>
# 粘贴到:https://github.com/settings/keys
平台特定设置
Windows:Gpg4win 安装
详细Windows设置,见参考资料/windows-setup.md。
快速安装:
# 选项1:下载安装程序
# https://gpg4win.org/thanks-for-download.html
# 选项2:winget
winget install --id GnuPG.Gpg4win -e --source winget
# 配置Git使用Gpg4win(如果安装在其他路径,请调整)
git config --global gpg.program "C:/Program Files (x86)/GnuPG/bin/gpg.exe"
macOS:GPG Suite / Homebrew
# 选项1:Homebrew(推荐)
brew install gnupg
# 选项2:GPG Suite
# 下载自:https://gpgtools.org/
# 配置Git(如果需要)
git config --global gpg.program $(which gpg)
Linux:GnuPG
# Debian/Ubuntu
sudo apt update && sudo apt install gnupg
# Fedora/RHEL
sudo dnf install gnupg2
# Arch
sudo pacman -S gnupg
WSL:遵循Linux说明
WSL用户: 遵循上述Linux设置说明(WSL运行Linux)。如果需要,见故障排除部分以了解WSL特定问题。
密钥生成
个人开发密钥(交互式)
# 交互式生成密钥
gpg --full-generate-key
# 按照提示:
# 1. 密钥类型:(9) ECC(签名和加密)*默认*
# 2. 曲线:(1) Curve 25519 *默认*
# 3. 过期时间:0 = 无过期(或2y表示2年)
# 4. 真实姓名:您的姓名
# 5. 邮箱:您的验证邮箱@email.com
# 6. 评论:(可选,可留空)
# 7. 密码:强20+字符密码
# 列出密钥以获取密钥ID
gpg --list-secret-keys --keyid-format=long
# 查找“sec ed25519/<密钥ID>”
推荐算法: 使用Curve25519的EdDSA(Ed25519)— 现代、快速、密钥小、安全性优秀
替代: RSA 4096位(传统,兼容性广)
导出密钥
# 导出公钥(用于GitHub)
gpg --armor --export <密钥ID>
# 导出私钥(仅用于备份 — 保持安全!)
gpg --armor --export-secret-keys <密钥ID>
Git 配置
启用提交签名
# 全局(所有仓库)
git config --global user.signingkey <密钥ID>
git config --global commit.gpgsign true
git config --global tag.gpgSign true
# 仓库本地(特定仓库)
cd /path/to/repo
git config user.signingkey <密钥ID>
git config commit.gpgsign true
验证配置
# 检查配置的密钥
git config --global user.signingkey
# 测试签名
git commit --allow-empty -m "测试GPG签名"
# 验证签名
git log --show-signature -1
密码缓存
GPG代理缓存密码以减少提示频率。
检查配置是否存在:
ls ~/.gnupg/gpg-agent.conf
创建或编辑 ~/.gnupg/gpg-agent.conf:
# 缓存密码,在8小时不活动后失效
default-cache-ttl 28800
# 无论使用情况,最大缓存时间为24小时
max-cache-ttl 86400
# 允许pinentry缓存密码
allow-preset-passphrase
应用更改:
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
全面缓存配置,包括安全场景、测试程序和故障排除,见参考资料/passphrase-caching.md。
Windows特定:双重GPG安装问题
Windows用户关键: Windows通常有两个独立的GPG安装(Gpg4win和Git Bash GPG),每个有不同的配置文件位置:
- Gpg4win:
%APPDATA%\gnupg\gpg-agent.conf(通常C:\Users\<用户名>\AppData\Roaming\gnupg\gpg-agent.conf) - Git Bash GPG:
~/.gnupg/gpg-agent.conf(解析为C:\Users\<用户名>\.gnupg\gpg-agent.conf)
常见问题: 当Git配置为使用Gpg4win时,配置了~/.gnupg/gpg-agent.conf(Git Bash GPG)。结果:配置被静默忽略,缓存不工作。
验证Git正在使用哪个GPG:
# 检查Git的GPG配置
git config --global gpg.program
# 如果输出是“C:/Program Files (x86)/GnuPG/bin/gpg.exe”:
# → 使用:%APPDATA%\gnupg\gpg-agent.conf
# 验证GPG的配置目录
gpgconf --list-dirs homedir
Windows配置必须包含pinentry-program:
# 示例:%APPDATA%\gnupg\gpg-agent.conf
default-cache-ttl 28800
max-cache-ttl 86400
allow-preset-passphrase
# Windows必需:
pinentry-program C:/Program Files (x86)/GnuPG/bin/pinentry-basic.exe
见: Windows设置指南 — 双重GPG安装以获取详细解释。
推荐缓存持续时间
| 场景 | default-cache-ttl | max-cache-ttl | 理由 |
|---|---|---|---|
| 高安全性 | 900(15分钟) | 3600(1小时) | 频繁提示,短窗口 |
| 平衡 | 3600(1小时) | 28800(8小时) | 每小时提示一次,当天过期 |
| 便利性 | 28800(8小时) | 86400(24小时) | 每个工作日提示一次,每天过期 |
GitHub 集成
添加GPG密钥到GitHub
-
导出公钥:
gpg --armor --export <密钥ID> -
添加到GitHub:
- 转到:https://github.com/settings/keys
- 点击“New GPG key”
- 粘贴ASCII-armored公钥
- 点击“Add GPG key”
-
验证邮箱匹配:
- Git邮箱必须匹配GPG密钥邮箱
- 邮箱必须在GitHub账户中验证
# 检查Git邮箱 git config --global user.email # 检查GPG密钥邮箱 gpg --list-keys <密钥ID>
故障排除“未验证”提交
可能原因:
- 公钥未添加到GitHub → 在设置 → SSH和GPG密钥中添加密钥
- 邮箱不匹配 → 确保Git邮箱 = GPG密钥邮箱 = GitHub验证邮箱
- 密钥过期 → 延长过期时间或生成新密钥
- 密钥吊销 → 生成新密钥(无法撤销)
故障排除
全面故障排除,见参考资料/troubleshooting.md。
“gpg: signing failed: No secret key”
原因: Git配置为使用密钥ID,但密钥环中不存在。
解决方案:
# 列出可用密钥
gpg --list-secret-keys --keyid-format=long
# 验证Git配置匹配可用密钥
git config --global user.signingkey
# 如果不匹配,更新配置
git config --global user.signingkey <正确密钥ID>
“gpg: signing failed: Inappropriate ioctl for device”
原因: GPG代理无法提示输入密码(终端问题)。
解决方案(Linux/macOS/WSL):
# 设置GPG_TTY环境变量
export GPG_TTY=$(tty)
# 添加到shell配置文件(例如,~/.bashrc、~/.zshrc)
echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
解决方案(Windows with Gpg4win):
# 使用GUI pinentry(调整路径以匹配您的Gpg4win安装)
echo 'pinentry-program "C:/Program Files (x86)/GnuPG/bin/pinentry-basic.exe"' >> ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
“error: gpg failed to sign the data”
调试步骤:
# 直接测试GPG签名
echo "test" | gpg --clearsign
# 检查GPG代理状态
gpgconf --list-components
# 检查密钥过期时间
gpg --list-keys --keyid-format=long <密钥ID>
# 重启GPG代理
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
# 再次尝试提交
git commit -m "test"
每次提交都提示密码(缓存不工作)
Windows用户: 这通常由双重GPG安装问题引起。见Windows设置 — 密码缓存故障排除和故障排除 — Windows缓存问题以获取详细诊断。
可能原因:
-
错误的配置文件位置(Windows):
# 验证Git正在使用哪个GPG git config --global gpg.program # 检查GPG的配置目录
gpgconf --list-dirs homedir
确保配置存在于正确位置
Windows(Gpg4win):%APPDATA%\gnupg\gpg-agent.conf
Windows(Git Bash):~/.gnupg/gpg-agent.conf
Linux/macOS/WSL:~/.gnupg/gpg-agent.conf
2. **gpg-agent.conf未加载:**
```bash
# 重启代理以加载配置
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
# 验证配置已加载
gpgconf --list-options gpg-agent | grep cache-ttl
-
缓存TTL设置过低 → 在
~/.gnupg/gpg-agent.conf中增加缓存时间 -
多个GPG代理运行:
# 杀死所有代理 pkill gpg-agent # 启动单个代理 gpgconf --launch gpg-agent
GPG 签名方法比较
| 方法 | 最适合 | 设置复杂性 | 密钥管理 |
|---|---|---|---|
| GPG | 全功能,支持过期/吊销 | 中等 | 最灵活 |
| SSH | 最简单,重用现有SSH密钥 | 低 | 功能有限 |
| S/MIME | 具有X.509证书的企业 | 高 | 组织管理 |
SSH签名(替代)
何时使用SSH代替GPG:
- 简单的个人项目
- 已有SSH密钥设置
- 不需要过期/吊销功能
- 想要最小配置
设置:
# 配置Git使用SSH签名
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
# 将SSH密钥添加到GitHub作为“Signing Key”
限制:
- 无密钥过期支持
- 无吊销跟踪
- 需要Git 2.34+(2021)
安全最佳实践
全面安全指导,见参考资料/security-best-practices.md。
快速推荐:
- ✅ 对个人密钥使用密码保护(最少20字符)
- ✅ 配置缓存以平衡安全性和便利性(4-8小时)
- ✅ 考虑密钥过期:个人项目无过期,企业工作1年过期
- ✅ 备份私钥到加密保险库或密码管理器的安全文档
- ⚠️ 永远不要在Git仓库、云存储或电子邮件中存储未加密密钥
资源
参考资料
- 快速命令参考 — 常见GPG和Git签名命令快速查阅
- Windows设置指南 — Gpg4win安装、Git Bash路径、安全考虑
- 密码缓存配置 — 缓存策略、安全权衡
- 安全最佳实践 — 密码保护、密钥过期、备份策略
- 故障排除指南 — 常见问题和解决方案
- GPG代理配置示例 — 示例配置文件
- 测试场景 — 技能激活验证场景
官方文档
相关技能
- git-commit:使用完整的git提交工作流程,包括Conventional Commits格式、安全协议和归属要求
- git-identity:使用多身份GPG密钥隔离 — 使用includeIf条件包含将不同的GPG密钥范围限定到不同目录
- config:高级Git配置,包括别名、凭证和性能调优
- setup:Git安装和配置的先决条件
版本历史
- v1.1.1(2025-11-25):渐进披露优化 — 将测试场景提取到参考文件,移除冗余快速命令参考部分,减少SKILL.md至500行以下
- v1.1.0(2025-11-22):增强故障排除 — 添加keyboxd守护进程竞争条件故障排除(T7777/T7829),动态GPG检测工作流程,Windows启动最佳实践与官方设计vs现实分析
- v1.0.5(2025-11-19):优化改进 — 向SKILL.md添加目录,将基本命令参考提取到quick-reference.md,行数从530减少到522
- v1.0.4(2025-11-17):渐进披露改进 — 将安全最佳实践提取到单独的参考文件
- v1.0.3(2025-11-17):基于官方文档验证 — 修复tag.gpgSign大小写,更新Last Verified日期
- v1.0.2(2025-11-12):增强文档 — 向长参考添加目录,记录测试场景
- v1.0.1(2025-11-13):添加跨引用到git-commit技能
- v1.0.0(2025-01-09):初始发布,从仓库文档迁移
最后更新
日期: 2025-11-28 模型: claude-opus-4-5-20251101