GPG 的正确使用姿势
内容提要
本文介绍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 检查公钥,再将公钥传到服务器即可。