Windows 安装 GPG (GNU Privacy Guard): https://www.gpg4win.org/
记得勾选 Kleopatra 选项, 相当于一个 gpg 的前端界面, 很方便
可以直接在GUI界面添加和管理密钥, 也可以在命令行使用 gpg 来使用
私钥
主密钥 (Master / Primary) |
主密钥是最重要的, 负责验证和签发其他子密钥, 不能泄露给任何人或直接使用
子密钥负责进行加密, 验证, 签名之类的作用
这两个统一属于私钥
公钥
[主密钥公钥] |
导出公钥时, 子密钥的公钥也包含在里面
公钥是给别人的, 别人使用你的公钥加密内容, 再由你使用私钥解开
公钥可以放在自己的网站上, 或者通过网络传给别人
| 路径 | 现实可行性 |
|---|---|
| 从密钥服务器拉取 | 最常用,但任何人都能上传任意身份的密钥 |
| 你当面给他 | 最可靠,但物理世界限制太大 |
| 从你网站下载 | 中间地带——方便,且域名本身提供了一定的身份锚定 |
| 从你的 GitHub/GitLab profile | 同上,平台替你做了身份绑定 |
你的网站是你在互联网上的”家”。把公钥放在你的域名下,等于用你对域名的控制权为这个公钥做了一次弱担保。这比密钥服务器上匿名的、可能被污染的公钥强一个量级。
主密钥保留在离线安全环境
日常只用子密钥
PGP 吊销证书
吊销证书是一个预先计算好的、特殊签名的数据块, 它声明某个 PGP 密钥对不再有效
本质上, 它是一段用私钥签名的”作废声明”
PGP 的一个核心矛盾:
密钥服务器(keyserver)被设计成”只增不删”——公钥一旦上传, 理论上永远留在上面
那如果你的私钥泄露了, 或者密码忘了, 再或者不再使用那个密钥了
你不能从互联网上”凭空抹掉”已经分发出去的公钥
吊销证书就是答案: 你无法删除公钥, 但可以追加一条高优先级的声明, 告诉所有人: “这把密钥废了, 别再用了。”
| 预生成吊销证书 | 即时吊销 | |
|---|---|---|
| 方式 | 创建密钥时立刻生成 | 私钥还在手里时临时执行 --gen-revoke |
| 条件 | 无需私钥 | 需要私钥 + 密码 |
| 适用场景 | 私钥丢失/遗忘密码后的兜底方案 | 私钥尚可用,主动废弃 |
GPG 密钥
1. 生成密钥
gpg --full-generate-key # 完整交互式生成 (推荐) |
不要选 --generate-key (无 full), 这个是简版,没法自定义算法和用途
2. 列出密钥
gpg --list-keys # 列出所有公钥 |
--keyid-format long 会输出类似 rsa4096/<KEY ID> 的格式, 后者就是常用的 Key ID
3. 导出密钥
# 导出公钥 (给别人用) |
4. 导入密钥
gpg --import alice-public.asc |
5. 删除密钥
gpg --delete-key <KEY ID> # 先删私钥 |
必须先删私钥, 如果没有私钥可以直接删公钥
GPG 加解密
加密:
# 非对称加密(用对方公钥) |
解密:
gpg --decrypt secret.txt.gpg # 自动检测并用对应私钥解密 |
--output 只能在加密/解密/签名时指定输出文件名, 写在命令末尾是无效的, 它必须紧跟在操作之后
GPG 吊销证书
# 生成吊销证书(建议生成密钥后立刻做) |
强烈建议生成密钥后马上生成吊销证书并离线保存
Git 签名提交
可以用 SSH 密钥或者 PGP 密钥给 commit 信息签名, 在 GitHub 上也会有已验证的标识
git config --global user.signingkey <KEY ID> |
然后我遇到的一个问题就是明明密钥 id 是对的但还是提示找不到密钥:
gpg: skipped "<KEY ID>": secret key not available |
根据 https://stackoverflow.com/questions/36810467/git-commit-signing-failed-secret-key-not-available
的方法解决了
For Windows users, it’s much more likely encountering this error because Git on Windows doesn’t use the correct gpg.
Not finding the correct binary in PATH, git resorts to using internally bundled gpg inside its minified MSYS, which has no knowledge of where your keys are. Setting gpg.
对于 Windows 用户来说,出现这个错误的可能性要大得多,因为 Windows 上的 Git 没有使用正确的 gpg。
由于在 PATH 中找不到正确的二进制文件,Git 会转而使用其精简版 MSYS 中捆绑的 gpg,而该 gpg 并不知道你的密钥在哪里。设置 gpg
通过在 Git 设置解决:
git config --global gpg.program "<你安装 GPG 的目录>" |
GitHub Discussions