大数跨境

任何人都可以冒充你向 GitHub 提交代码(以下是如何阻止他们的方法)

任何人都可以冒充你向 GitHub 提交代码(以下是如何阻止他们的方法) 索引目录
2025-11-05
4
导读:关注「索引目录」公众号,获取更多干货。从 2020 年就开始对我的 Git 提交进行签名,这是一种看似可有可无的安全措施,但当你意识到有人冒充你有多么容易时,就会明白它的重要性。

关注「索引目录」公众号,获取更多干货。

从 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

  1. 前往 GitHub → 设置 → SSH 和 GPG 密钥
  2. 点击“新建 GPG 密钥”
  3. 粘贴您的公钥
  4. 点击“添加 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 让续订变得轻松便捷:

  1. 打开 GPG 钥匙扣
  2. 选择你的钥匙
  3. 双击打开关键详情
  4. 点击Change...到期日旁边的按钮



  1. 选择新的到期日(我通常会延长几个月)



  1. 请输入您的密码短语以确认

您无需更新 GitHub 上的任何内容。密钥 ID 保持不变,因此 git 和 GitHub 可以继续正常工作,无需任何更改。

故障排除

“gpg 数据签名失败”

这通常意味着:

  1. GPG 找不到您的密钥
    :请再次检查您的密钥 ID。gpg --list-secret-keys
  2. 密码问题
    :您的密码提示可能已被隐藏。请尝试运行命令echo "test" | gpg --clearsign以触发它。
  3. GPG路径错误
    :请确保git config --global gpg.program指向正确的位置

在 macOS 上,如果您是通过 GPG Tools 安装的,则路径应该是/usr/local/bin/gpg.

“没有秘密密钥”

这意味着 Git 正在查找一个不存在的键。运行:

gpg --list-secret-keys

请确保 Git 配置中的密钥 ID 与列出的密钥之一匹配。

GitHub 上仍显示提交未验证

请检查:

  1. 您的 Git 配置中的电子邮件地址与您的 GPG 密钥上的电子邮件地址一致。
  2. 您的 GitHub 帐户已验证电子邮件地址
  3. 您已将公钥上传到 GitHub。

总结

设置过程大约需要 15 分钟,但配置完成后,您就无需再操心了。您提交的每一个代码都会自动签名,并且您会获得一个验证徽章,证明代码确实是您本人编写的。

如果你从事开源项目或身处对代码来源要求很高的环境中,签名提交就不是可选项,而是必备条件。既然你已经开始考虑这个问题,不妨现在就把它设置好。


关注「索引目录」公众号,获取更多干货。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读1.1k
粉丝0
内容444