GnuPG 加密与签名速查表 - GPG 加密解密命令大全

GPG 的日常动作可以压成四个:生成密钥对、把公钥给对方、对方用你的公钥加密、你用私钥解密或签名。真正容易翻车的不是命令而是密钥本身——私钥丢了就无法恢复,所以生成后第一件事是导出备份;收到他人公钥也别直接信任,要核对指纹确认没有被中间人替换。本表按密钥生成与管理、导入导出、加密解密、签名验证、信任与密钥服务器、Git 签名与实用分组,把整条链路串起来。日常使用时还有两个习惯值得保持:用 -a 输出 ASCII armored 形式以便放进邮件或聊天窗口;用 gpg-agent 缓存密码,少输多次口令;给密钥加过期时间并定期轮换,比一次性设置永不过期更容易应对审计。

系统与运维·共 37 条命令·最后更新 2026-07-21
gpg加密签名安全

典型使用场景

面向需要「可验证的身份」而不是「信任某个人」的场景:给 Git 提交和 tag 签名、把发布包签名让人验证、把机密文件加密给同事、给自己签发密钥做备份。GnuPG 的失败原因往往很具体也很反直觉:gpg-agent 没起来时一切卡死、导入了公钥却忘了 trust 导致验证仍提示「未经签名」、密钥服务器上一个字符的邮箱输错就静默返回空结果。所以本表的重点不只是命令怎么写,而是每一步做完后**去哪儿看结果**。

密钥生成与管理 8

gpg --full-generate-key
交互式生成密钥对(可选算法和有效期)
gpg --quick-generate-key "Name <email>"
快速生成密钥
gpg --list-keys
列出所有公钥
gpg --list-secret-keys
列出所有私钥
gpg --list-keys KEYID
查看指定密钥详情
gpg --edit-key KEYID
交互式编辑密钥(添加子密钥、设置过期等)
gpg --delete-key KEYID
删除公钥
gpg --delete-secret-key KEYID
删除私钥

密钥导入导出 6

gpg --export -a KEYID > pubkey.asc
导出公钥为 ASCII 文件
gpg --export-secret-keys -a KEYID > private.asc
导出私钥(务必妥善保管)
gpg --import pubkey.asc
导入公钥
gpg --import private.asc
导入私钥
gpg --send-keys KEYID --keyserver keyserver.ubuntu.com
上传公钥到密钥服务器
gpg --recv-keys KEYID
从密钥服务器获取公钥

加密与解密 6

gpg -e -r recipient@domain.com secret.txt
用收件人公钥加密文件
gpg -e -r user@domain.com -o secret.txt.gpg secret.txt
加密并指定输出文件名
gpg -d secret.txt.gpg > secret.txt
解密文件并输出到指定文件
gpg -c secret.txt
对称加密(仅用密码,无需公钥)
gpg -d secret.txt.gpg
解密对称加密文件
echo "message" | gpg -e -r user@domain.com
加密管道输入的文本

签名与验证 6

gpg -s document.txt
生成签名(生成 .gpg 二进制文件)
gpg --clear-sign document.txt
生成明文签名(可读且含签名)
gpg -b document.txt
生成分离签名(.sig 文件,原文不变)
gpg --verify document.txt.sig document.txt
验证分离签名
gpg --verify document.txt.asc
验证明文签名文件
gpg --detach-sign -a file.tar.gz
生成 ASCII 分离签名

信任与密钥服务器 5

gpg --edit-key KEYID\n> trust
设置密钥信任级别(交互式)
gpg --sign-key KEYID
对他人公钥签名(信任背书)
gpg --refresh-keys
从密钥服务器刷新所有密钥
gpg --search-keys "user@domain.com"
在密钥服务器搜索公钥
gpg --fingerprint KEYID
查看密钥指纹用于核对身份

Git 签名与实用 6

git config --global user.signingkey KEYID
设置 Git 使用的签名密钥
git config --global commit.gpgsign true
开启所有提交自动签名
git commit -S -m "message"
创建 GPG 签名提交
git tag -s v1.0 -m "release"
创建 GPG 签名标签
git verify-commit HEAD
验证最新提交的签名
gpgconf --kill gpg-agent
重启 gpg-agent(解决密码缓存问题)

参数矩阵

参数作用示例
--quick-generate-key非交互一条命令出密钥,适合脚本;无交互选项时用它代替 --full-generate-keygpg --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. 1签名验证失败时,先核对指纹再看信任

    gpg --fingerprint KEYID && gpg --verify document.txt.sig document.txt

    指纹必须与对方公开渠道公布的完全一致;一致但仍警告,说明是 trust 未设,不是密钥不对。

  2. 2按邮箱找密钥

    gpg --search-keys "user@domain.com"

    拿到 KEYID 后用 gpg --recv-keys KEYID 精确拉取,比直接 recv 邮箱可靠。

  3. 3确认本机公私钥齐全

    gpg --list-keys && gpg --list-secret-keys

    --list-keys 有而 --list-secret-keys 没有,说明私钥没导入或已被删除,签名会失败。

  4. 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们