介绍
什么是 GnuPG
GnuPG ( GNU Privacy Guard ) 是一款符合 OpenPGP 标准的开源加密软件,广泛应用于保护电子邮件、文件及数字身份的安全。它通过公钥密码学提供加密、签名、身份认证等功能,确保通信的保密性、完整性和可信度,是保证现代数字交流安全关键工具。
基本概念
- 公钥(Public Key):用于加密数据或验证签名,可以公开分发。
- 私钥(Private Key):用于解密数据或生成签名,必须妥善保管。
密钥的四个功能:
- 加密(Encryption):保护数据机密性,只有持有对应私钥的人才能解密。
- 签名(Signing):验证数据来源和完整性,任何人都可以用公钥验证签名。
- 认证(Authentication):确认身份,确保通信双方的真实性。
- 密钥管理(Key Management):生成、存储、分发和撤销密钥,确保密钥的安全和有效性。
主密钥与子密钥
- 主密钥(Primary Key):用于管理整个密钥体系 ( 如签发/吊销子密钥 ) ,一般只用于签名和认证。
- 子密钥(Subkey):主密钥下属的密钥,通常分别用于加密、签名、认证等,便于权限分离和密钥轮换。
主密钥是整个身份体系的根,一旦泄露,所有子密钥都不再安全。通过日常只使用子密钥 ( 如加密、签名 ) ,主密钥则离线保存,仅在必要时 ( 如签发新子密钥、吊销密钥 ) 使用,可以极大降低主密钥泄露风险。
加密密钥和签名密钥承担不同职责:加密密钥用于保护数据机密性,签名密钥用于身份认证和数据完整性。分离这两类密钥可以减少单点失效风险,便于密钥轮换和权限管理。例如,签名密钥泄露时只需吊销签名子密钥,无需更换加密密钥。
总结
| 功能 | 对象 | 简要说明 |
|---|---|---|
| 签名 / Signing | 子私钥 ( ssb ) 主私钥 ( sec ) | 用私钥对文件、邮件、Git 提交等进行数字签名,证明内容来源和完整性。 通常用子私钥签名,避免主密钥泄露风险。 |
| 子公钥 ( sub ) 主公钥 ( pub ) | 用对应公钥验证签名是否有效。 | |
| 身份验证 / Authentication | 子私钥 ( ssb ) | 用于身份认证,例如 SSH 登录等场景。通常用子私钥。 |
| 子公钥 ( sub ) | 验证身份是否真实。 | |
| 认证 / Certification | 主私钥 ( sec ) | 主密钥专有功能,管理密钥绑定、撤销子密钥及 UID 等。 |
| 主公钥 ( pub ) | 认证身份和绑定关系的公钥。 | |
| 加密 / Encryption | 子私钥 ( ssb ) | 使用子私钥解密别人用子公钥加密的消息。 |
| 子公钥 ( sub ) | 用子公钥对消息加密,确保只有私钥持有者能解密。 |
- 默认情况下,主密钥具有「签名/认证」功能,但主密钥也可以只具备认证功能,不用于签名,以降低风险。
最佳实践
-
用户 ID ( UID )
- UID 绑定到主密钥上,子密钥也绑定于所有 UID。如果需要让子密钥只对应特定身份,应生成新的主密钥。例如工作签名用工作邮箱生成独立主密钥,子密钥只用于工作身份。
- 同一个主密钥上可以对应多个 UID ( 如多个邮箱、昵称等 ) ,便于管理多个身份。比如 github 验证 commit 需要验证 UID 邮箱。
-
子密钥管理
- 应在每个设备生成独立的可替换签名子密钥,旧设备弃用时撤销子密钥。
- 认证和加密子密钥重要且敏感,通常需要跨设备共享,建议使用独特密码保护。
-
省略不必要的密钥
- 默认的 GnuPG 生成的主密钥既能认证又能签名,这并非最佳实践。建议用只具备认证功能的主密钥,并自行生成单功能的子密钥。
- 建议配置文件设定
default-new-key-algo ed25519/cert,避免默认生成无用的签名和加密主密钥。
-
密钥过期管理
- 每个密钥应设置过期时间。
- 过期时间不是废弃时间,而是提示需要更新,可延长有效期。
- 过期还帮助他人判断何时应获取密钥最新版本。
-
密钥撤销
- 撤销与过期不同,撤销不可恢复,是表明密钥不应再使用。
- 撤销时应包含原因,无恶意的撤销仍保持签名有效性。
- 不再使用的密钥应及时撤销并指向新密钥。
-
密钥服务器
- 在密钥「首选密钥服务器」字段中设定自己的密钥托管地址 ( 不必是中央密钥服务器,可以是自己托管的 HTTPS 服务 ) 。
- 每次更新密钥时更新该地址,确保他人能随时自动获取最新密钥版本。
- 结合 GnuPG 的
--keyserver-options honor-keyserver-url参数,可自动从首选地址获取最新密钥。 - 签名时最好将密钥来源信息包含在签名中,以增强验证可靠性。
-
密钥发布
- 通过密钥服务器可轻松为持有旧密钥的用户提供最新密钥。但如 SKS Keyserver Pool 等密钥服务器 ( 世界最大 Keyserver 池 ) 不推荐使用,见 安全风险和争议, 被玩坏的 KeyServer
- 通过邮件,若邮件服务提供商支持 Web Key Directory ( WKD ) 功能,可直接获得邮箱对应公钥。
- 还可以线下纸笔交换 ( 雾

上手实操
- 生成主密钥及子密钥
gpg --full-gen-key
# 按提示选择主密钥类型、长度、有效期等,默认主密钥带有签名和认证功能,如果只想要认证功能,可以加上 --expert 选项
# 生成后可用 gpg --edit-key <UID> 添加子密钥,同样推荐加上 --expert 选项以精细控制
gpg --expert --edit-key <UID>
- 导出主密钥和子密钥
# 导出私钥
gpg --export-secret-keys <UID> > masterkey.sec
# 导出子私钥
gpg --export-secret-subkeys <UID> > subkeys.sec
# 导出公钥
gpg --export -a <UID> > pubkey.asc
- 生成吊销证书
gpg --output revoke.asc --gen-revoke <UID>
# 妥善保存 revoke.asc
参考资料
Seeking Guidance For The Best Practices for Managing Multiple GPG Keys