GPG 的正确使用姿势

💡 原文中文,约26400字,阅读约需63分钟。
📝

内容提要

本文介绍GPG密钥的安全管理:主密钥仅用于认证并离线加密存储,日常使用签名、加密、认证三个子密钥。教程演示在虚拟机或Tails中生成RSA4096主密钥及子密钥,用加密子密钥保护主密钥和吊销证书,并讲解导入、修改信任级别、修改子密钥密码等操作,最后补充用PGP为Git提交签名及SSH认证的配置方法。

🔎

延伸解读

主密钥离线存储的实际操作要点

文章强调主密钥仅用于认证且必须离线加密存储。实际操作中,作者在虚拟机或Tails中生成RSA4096主密钥,并导出后用加密子密钥保护。这意味着日常使用的机器上不应保留主密钥明文,导入时也需避免误导入主密钥。对于需要频繁签名的场景,这种隔离能降低主密钥泄露风险,但代价是每次使用子密钥前需解密导入,流程更繁琐。

子密钥有效期与续期管理

文章建议子密钥设置有效期(如1年),而非永久有效。这样做的好处是即使子密钥泄露,影响时间有限;到期后可用主密钥延长有效期或更换新子密钥。但作者也指出,续期后需要更新GitHub等平台上的公钥,增加了维护成本。读者需权衡安全性与便利性,根据自身使用频率决定有效期长短。

加密子密钥的保护与备份策略

文章用加密子密钥保护主密钥和吊销证书,但加密子密钥本身又用DES对称加密存储。这种层层加密的思路提高了安全性,但也带来管理复杂度:需要记住多个密码,且加密子密钥一旦丢失,所有加密文件都无法恢复。作者建议将加密子密钥与加密后的文件分开存放,并确保备份可靠。对于普通用户,需评估是否值得采用如此复杂的方案。

GPG用于Git签名和SSH认证的配置差异

文章补充了用PGP为Git提交签名及SSH认证的配置。Git签名只需指定签名子密钥ID并开启自动签名,相对简单;而SSH认证需配置gpg-agent、sshcontrol等文件,且在不同系统(Windows/Linux)上步骤不同,容易出错。作者提醒注意换行符和每次修改配置后重启agent。若仅需Git签名,不必折腾SSH认证;若想统一密钥管理,则需接受更高的配置成本。

❓

Q&A

GPG 主密钥和子密钥分别应该怎么用?

主密钥只用来认证(Certify),平时离线加密存储;日常使用签名、加密、认证三个子密钥。

生成 GPG 主密钥时如何设置只用于认证?

使用 gpg --full-generate-key --expert,选择 RSA 自定义用途(选项8),去掉 Sign 和 Encrypt,只保留 Certify,密钥长度设为 4096 位。

如何安全地导出和存储 GPG 主密钥?

用加密子密钥加密主密钥后导出:gpg -a --export-secret-key <主密钥ID> | gpg -e -r <你的名字> | dd of=sk.key。加密子密钥本身用 DES 对称加密保护,例如 gpg -a --export-secret-subkeys <加密子密钥ID>! | openssl des3 -salt | dd of=enc.key。

为什么子密钥要设置有效期?

子密钥建议设置有效期(如1年),不要永久有效。临近过期或已过期时,可以用主密钥延长有效期,这样更安全,但需要替换 GitHub 等平台上的公钥。

如何修改 GPG 子密钥的密码?

导入子密钥(不要导入主密钥),运行 gpg --expert --edit-key <你的名字>,输入 passwd 修改密码。虽然会提示 error changing passphrase,但密码实际已修改成功。注意 GnuPG 2.3 实测无法只修改子密钥密码。

如何用 PGP 为 Git 提交签名?

先找到签名子密钥 ID,然后设置:git config --global user.signingkey <子密钥ID> 和 git config --global commit.gpgsign true。这样每次 commit 自动签名,否则需加 -S 参数。别忘了把公钥上传到 GitHub。

如何用 GPG 密钥进行 SSH 认证?

在 ~/.gnupg/gpg-agent.conf 中添加 enable-ssh-support,在 ~/.gnupg/sshcontrol 中写入认证子密钥的 Keygrip,并在 shell 配置中设置 export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)。重启 gpg-agent 后,用 ssh-add -L 检查公钥,再将公钥传到服务器即可。

🏷️

标签

➡️

继续阅读