GnuPG 加密与签名速查表 - GPG 加密解密命令大全
GPG 的日常动作可以压成四个:生成密钥对、把公钥给对方、对方用你的公钥加密、你用私钥解密或签名。真正容易翻车的不是命令而是密钥本身——私钥丢了就无法恢复,所以生成后第一件事是导出备份;收到他人公钥也别直接信任,要核对指纹确认没有被中间人替换。本表按密钥生成与管理、导入导出、加密解密、签名验证、信任与密钥服务器、Git 签名与实用分组,把整条链路串起来。日常使用时还有两个习惯值得保持:用 -a 输出 ASCII armored 形式以便放进邮件或聊天窗口;用 gpg-agent 缓存密码,少输多次口令;给密钥加过期时间并定期轮换,比一次性设置永不过期更容易应对审计。
典型使用场景
面向需要「可验证的身份」而不是「信任某个人」的场景:给 Git 提交和 tag 签名、把发布包签名让人验证、把机密文件加密给同事、给自己签发密钥做备份。GnuPG 的失败原因往往很具体也很反直觉:gpg-agent 没起来时一切卡死、导入了公钥却忘了 trust 导致验证仍提示「未经签名」、密钥服务器上一个字符的邮箱输错就静默返回空结果。所以本表的重点不只是命令怎么写,而是每一步做完后**去哪儿看结果**。
密钥生成与管理 8
gpg --full-generate-keygpg --quick-generate-key "Name <email>"gpg --list-keysgpg --list-secret-keysgpg --list-keys KEYIDgpg --edit-key KEYIDgpg --delete-key KEYIDgpg --delete-secret-key KEYID密钥导入导出 6
gpg --export -a KEYID > pubkey.ascgpg --export-secret-keys -a KEYID > private.ascgpg --import pubkey.ascgpg --import private.ascgpg --send-keys KEYID --keyserver keyserver.ubuntu.comgpg --recv-keys KEYID加密与解密 6
gpg -e -r recipient@domain.com secret.txtgpg -e -r user@domain.com -o secret.txt.gpg secret.txtgpg -d secret.txt.gpg > secret.txtgpg -c secret.txtgpg -d secret.txt.gpgecho "message" | gpg -e -r user@domain.com签名与验证 6
gpg -s document.txtgpg --clear-sign document.txtgpg -b document.txtgpg --verify document.txt.sig document.txtgpg --verify document.txt.ascgpg --detach-sign -a file.tar.gz信任与密钥服务器 5
gpg --edit-key KEYID\n> trustgpg --sign-key KEYIDgpg --refresh-keysgpg --search-keys "user@domain.com"gpg --fingerprint KEYIDGit 签名与实用 6
git config --global user.signingkey KEYIDgit config --global commit.gpgsign truegit commit -S -m "message"git tag -s v1.0 -m "release"git verify-commit HEADgpgconf --kill gpg-agent参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
--quick-generate-key | 非交互一条命令出密钥,适合脚本;无交互选项时用它代替 --full-generate-key | gpg --quick-generate-key "Name <email>" |
--recv-keys | 从密钥服务器拉取他人公钥;必须配 KEYID 或邮箱,邮箱拼错不会报错只是拉不到 | gpg --recv-keys KEYID |
--clear-sign | 生成明文签名,正文可读且内嵌签名,适合邮件与可读性优先的场景 | gpg --clear-sign document.txt |
commit.gpgsign | 让 git 每次提交自动 GPG 签名,验证方可追溯到密钥指纹 | git config --global commit.gpgsign true |
gpgconf --kill gpg-agent | 重启代理进程,解决改密码后不弹口令、旧口令一直有效的僵死状态 | gpgconf --kill gpg-agent |
易错点与避坑指南
现象gpg --import 后 gpg --verify 仍提示签名不是来自这个密钥,甚至出现 WARNING。
原因公钥导入了但没有建立信任,gpg 不知道该密钥是否可信。
处置先 gpg --fingerprint KEYID 核对指纹,再 gpg --edit-key KEYID 进入后 trust 设成 ultimate,退出后重新验证。
现象gpg --recv-keys 命令跑完没有任何输出,也没报错,但公钥并不在本地。
原因邮箱拼错或密钥服务器上根本没有对应密钥,收到的响应为空。
处置改用 gpg --search-keys "user@domain.com" 先搜到确切 KEYID/指纹,再 gpg --recv-keys。
现象改了私钥密码后 gpg 仍然只认旧密码,或操作长时间卡住不返回。
原因gpg-agent 缓存了旧的 passphrase 状态,进程僵死。
处置执行 gpgconf --kill gpg-agent 重启代理后再操作。
现象git commit -S 卡在终端里不返回,CI 上直接失败。
原因gpg 需要交互式输入口令,无 TTY 的环境(CI、定时任务)里必然挂住。
处置CI 中改用 gpg --batch --pinentry-mode loopback 配合 gpg-agent 缓存,并在提交前 gpgconf --kill gpg-agent 验证缓存可用。
现象导出的私钥文件随手提交进了仓库或发到了聊天工具。
原因gpg --export-secret-keys -a KEYID 输出的是可直接使用的私钥,泄露即失去全部身份。
处置立即 gpg --delete-secret-key KEYID 并吊销对应公钥,重新生成密钥对;私钥只进密码管理器或离线备份。
排障路径
1签名验证失败时,先核对指纹再看信任
gpg --fingerprint KEYID && gpg --verify document.txt.sig document.txt指纹必须与对方公开渠道公布的完全一致;一致但仍警告,说明是 trust 未设,不是密钥不对。
2按邮箱找密钥
gpg --search-keys "user@domain.com"拿到 KEYID 后用 gpg --recv-keys KEYID 精确拉取,比直接 recv 邮箱可靠。
3确认本机公私钥齐全
gpg --list-keys && gpg --list-secret-keys--list-keys 有而 --list-secret-keys 没有,说明私钥没导入或已被删除,签名会失败。
4代理状态异常时重置
gpgconf --kill gpg-agent口令缓存失效、改密码后不生效、gpg 卡死,都先用这条重置代理。
提示
- Git commit 签名:git config --global commit.gpgsign true,配合 GPG 密钥使用。
- gpg --armor (-a) 可以生成 ASCII 格式的密钥或签名,方便文本传输。
- 密钥备份:导出私钥 gpg --export-secret-keys -a KEYID > private.asc,妥善保管。
- gpg-agent 可以缓存密码,避免每次解密都输入密码。
- gpgconf --kill gpg-agent 可以重启 agent,解决密码缓存异常问题。
- 密钥指纹是验证密钥真伪的重要方式,导入他人公钥后务必核对指纹。
- 生成时带 --quick-generate-key "姓名 <邮箱>" 少一堆交互,subkey 的默认算法已够日常签名与加密使用。
- gpg --list-keys --keyid-format LONG 显示完整 KEYID,撤销时用 --revoke 指定该 ID 比短指纹可靠。
- 导入他人公钥后先 gpg --fingerprint 查看,信任等级用 --edit-key 设为 ultimate 前务必线下核对指纹。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。