关注「索引目录」公众号,获取更多干货。
从 2020 年就开始对我的 Git 提交进行签名,这是一种看似可有可无的安全措施,但当你意识到有人冒充你有多么容易时,就会明白它的重要性。GitHub 提交签名使用GPG(GNU Privacy Guard)加密技术来证明只有你一个人进行了提交。
任何人都可以设置自己的 Git 配置,使用你的姓名和邮箱,然后提交代码,这些代码就会像你写的一样显示在 GitHub 上。真的。唯一的区别?没有“已验证”徽章。
GPG是什么?
GPG(GNU Privacy Guard)是 OpenPGP 标准的开源实现,用于加密和签名数据。它通常用于加密电子邮件和文件,但也非常适合对 Git 提交进行签名。使用 GPG 对提交进行签名时,您实际上是在创建一个加密签名,以证明该提交来自拥有您私钥访问权限的人,而不仅仅是知道您的姓名和电子邮件地址的人。
如果您想深入了解 OpenPGP 标准,请查看官方的 OpenPGP 规范。
为什么要签署承诺书?
现实世界中的身份冒充案例
冒充提交者并非只是理论上的存在。以下是一些实际应用场景:
- 开源贡献
:有人可能冒用核心维护者的身份提交恶意代码,使其看起来像是可信的代码。 - 工作环境
:拥有代码仓库访问权限的攻击者可以以您的身份提交代码,这可能会导致您因代码漏洞或安全问题而受到指责。 - 审计追踪
:在受监管行业中,能够以加密方式证明谁编写了哪些代码对于合规性至关重要。 - 供应链攻击
:攻击者冒充开发人员,将恶意代码注入到广泛使用的库中,影响数千个下游项目。
“已验证”徽章不仅仅是装饰性的。它证明提交确实来自密钥持有者本人,而不是冒充者。
真的有人在乎吗?
说实话?大多数开发者不会在每次提交代码时都检查验证徽章。
但系统对此非常重视。组织可以通过分支保护规则要求提交代码必须经过签名。受监管的行业需要签名提交才能合规。安全工具会标记缺少签名提交的代码库。而当供应链攻击发生时,签名提交是证明合法性的唯一方法。
这就像十年前的HTTPS一样。一开始是可选的,后来就成了必需品。
你不是为了今天做准备,而是为了在关键时刻做好准备。
本指南适用于 macOS
本教程重点介绍如何使用 macOS 上的 GPG Keychain(GPG Suite的一部分),它提供了一个友好的图形用户界面 (GUI) 来进行密钥管理。如果您使用的是 Linux 或 Windows 系统,概念是相同的,但您会使用不同的工具:
- Linux
:使用 gpg命令行工具(通常已预装) - Windows
:如果使用适用于 Linux 的 Windows 子系统(WSL),请尝试使用Gpg4win或 Linux 方法。
所有平台上的 Git 配置步骤都相同。假设您已拥有 GitHub 帐户,并大约需要 15 分钟时间。
步骤 1:安装 GPG 工具
请访问gpgtools.org下载 GPG Suite。它包含 GPG Keychain,为您提供了一个可视化的密钥管理界面,而无需使用命令行工具。
安装方式与其他Mac应用程序相同。
步骤 2:生成您的 GPG 密钥
打开 GPG Keychain 并点击“新建”以创建密钥对。
填写:
- 姓名
:您的真实姓名(应与您的 GitHub 帐户姓名一致) - 电子邮件
:与您的 GitHub 帐户关联的电子邮件地址 - 密码短语
:选择一个强密码短语。每次签署提交时都需要用到它。
重要设置:
-
我把密钥的有效期设置为一年。这是一个很好的安全措施。如果你的密钥泄露,它最终会失效。你可以在密钥快到期时随时延长有效期。 -
为了保证安全性,请确保密钥类型为 RSA,并且至少为 4096 位。
点击“生成密钥”,然后等待几秒钟。
⚠️备份您的私钥
您的密码短语可以保护您的私钥,但它并非备份。如果您丢失了私钥文件本身(例如在计算机崩溃或重装系统期间),即使您知道密码短语也无济于事。如果没有私钥文件,即使您记得密码短语,也无法签署新的提交。
好的备份方案:
-
导出您的私钥( gpg --export-secret-keys --armor YOUR_KEY_ID > private-key.asc),并将其作为安全笔记存储在 1Password 或 Bitwarden 等密码管理器中。请注意,您很可能需要输入您的密码短语。
-
将整个目录备份 ~/.gnupg到加密云存储 -
将加密副本保存在安全的外部驱动器上
无论你选择哪种方法,都要确保它经过加密,并且只有你自己才能访问。
步骤 3:导出您的公钥
在 GPG 钥匙串中,选择您的新密钥,然后从菜单中选择“导出” (或右键单击密钥)。
确保“在导出文件中包含密钥”选项未被选中,并将其保存到某个位置。
用文本编辑器打开该文件。它看起来会像这样:
-----BEGIN PGP PUBLIC KEY BLOCK-----
[bunch of random-looking characters]
-----END PGP PUBLIC KEY BLOCK-----
复制整个代码块。
步骤 4:将您的公钥添加到 GitHub
-
前往 GitHub → 设置 → SSH 和 GPG 密钥 -
点击“新建 GPG 密钥” -
粘贴您的公钥 -
点击“添加 GPG 密钥”
GitHub 现在知道了你的公钥,可以验证用你的私钥签名的提交。
步骤 5:配置 Git 对提交进行签名
打开终端并运行以下命令:
首先,获取您的密钥 ID:
gpg --list-secret-keys --keyid-format=long
你会看到类似这样的输出:
sec rsa4096/ABC123DEF456 2022-01-15 [SC] [expires: 2026-01-15]
那ABC123DEF456部分是你的关键ID。
现在配置 Git:
# Tell git which key to use (replace with your actual key ID)
git config --global user.signingkey ABC123DEF456
# Tell git to sign all commits by default
git config --global commit.gpgsign true
# Tell git where GPG is located (for macOS)
git config --global gpg.program /usr/local/bin/gpg
如果您想验证您的配置:
git config --global --list | grep gpg
git config --global --list | grep signingkey
你应该看看:
commit.gpgsign=true
user.signingkey=ABC123DEF456
gpg.program=/usr/local/bin/gpg
第六步:测试
创建一个测试提交:
git commit --allow-empty -m "Testing GPG signing"
git log --show-signature -1
你应该会在输出中看到“签名正确”。如果你将此提交推送到 GitHub,你会在提交旁边看到漂亮的“已验证”徽章。
注意:首次使用 GPG 密钥提交更改时,系统会要求您输入密码短语并将其添加到 Apple 钥匙串。这是正常现象,这样做可以避免每次都提示输入密码短语。
密钥续期(到期时)
当您的密钥即将到期时,GPG Keychain 让续订变得轻松便捷:
-
打开 GPG 钥匙扣 -
选择你的钥匙 -
双击打开关键详情 -
点击Change...到期日旁边的按钮
-
选择新的到期日(我通常会延长几个月)
-
请输入您的密码短语以确认
您无需更新 GitHub 上的任何内容。密钥 ID 保持不变,因此 git 和 GitHub 可以继续正常工作,无需任何更改。
故障排除
“gpg 数据签名失败”
这通常意味着:
- GPG 找不到您的密钥
:请再次检查您的密钥 ID。 gpg --list-secret-keys - 密码问题
:您的密码提示可能已被隐藏。请尝试运行命令 echo "test" | gpg --clearsign以触发它。 - GPG路径错误
:请确保 git config --global gpg.program指向正确的位置
在 macOS 上,如果您是通过 GPG Tools 安装的,则路径应该是/usr/local/bin/gpg.
“没有秘密密钥”
这意味着 Git 正在查找一个不存在的键。运行:
gpg --list-secret-keys
请确保 Git 配置中的密钥 ID 与列出的密钥之一匹配。
GitHub 上仍显示提交未验证
请检查:
-
您的 Git 配置中的电子邮件地址与您的 GPG 密钥上的电子邮件地址一致。 -
您的 GitHub 帐户已验证电子邮件地址 -
您已将公钥上传到 GitHub。
总结
设置过程大约需要 15 分钟,但配置完成后,您就无需再操心了。您提交的每一个代码都会自动签名,并且您会获得一个验证徽章,证明代码确实是您本人编写的。
如果你从事开源项目或身处对代码来源要求很高的环境中,签名提交就不是可选项,而是必备条件。既然你已经开始考虑这个问题,不妨现在就把它设置好。
关注「索引目录」公众号,获取更多干货。

