跳至主要内容

关于提交签名验证

您可以使用 GPG、SSH 或 S/MIME 在本地签名标签和提交。这些标签或提交在 GitHub 上标记为已验证,因此其他人可以确信更改来自可信来源。

关于提交签名验证

您可以本地签名提交和标签,以使其他人确信您所做更改的来源。如果提交或标签具有可通过加密方式验证的 GPG、SSH 或 S/MIME 签名,则 GitHub 会将该提交或标签标记为“已验证”或“部分已验证”。

Screenshot of a commit in the commit list for a repository. "Verified" is highlighted with an orange outline.

对于大多数个人用户而言,GPG 或 SSH 将是签名提交的最佳选择。S/MIME 签名通常在大型组织的上下文中需要。SSH 签名是最简单的生成方式。您甚至可以将您现有的身份验证密钥上传到 GitHub 以用作签名密钥。生成 GPG 签名密钥比生成 SSH 密钥更复杂,但 GPG 具有 SSH 不具备的功能。GPG 密钥可以过期或在不再使用时被撤销。GPG 签名可能包含有关其已过期或被撤销的信息。

提交和标签具有以下验证状态,具体取决于您是否启用了严格模式。默认情况下,严格模式未启用。有关如何启用严格模式的信息,请参阅“显示所有提交的验证状态”。

签名提交与签署提交不同。有关签署提交的更多信息,请参阅“管理存储库的提交签署策略”。

默认状态

状态描述
已验证提交已签名,并且签名已成功验证。
未验证提交已签名,但无法验证签名。
无验证状态提交未签名。

持久提交签名验证

无论签名选择是什么 - GPG、SSH 或 S/MIME - 一旦提交签名得到验证,它将在其存储库的网络中保持验证状态。请参阅“了解存储库之间的连接”。

当提交签名在推送到 GitHub 时得到验证时,验证记录将与提交一起存储。此记录无法编辑,并且将持续存在,以便签名随着时间的推移保持验证状态,即使签名密钥被轮换、撤销或贡献者离开组织也是如此。

验证记录包括一个时间戳,标记验证完成的时间。此持久记录确保一致的已验证状态,提供存储库内贡献的稳定历史记录。您可以通过将鼠标悬停在 GitHub 上的“已验证”徽章上或通过 REST API 访问提交来查看此时间戳,其中包括 verified_at 字段。请参阅“提交的 REST API 端点”。

持久提交签名验证适用于推送到 GitHub 的新提交。对于在此功能之前存在的任何提交,将在下次在 GitHub 上验证提交的签名时创建持久记录,这有助于确保已验证的状态在存储库的历史记录中保持稳定可靠。

记录即使在撤销和过期后也仍然存在

持久提交签名验证反映了验证时提交的已验证状态。这意味着,如果签名密钥随后被撤销、过期或以其他方式更改,则先前已验证的提交将根据初始验证期间创建的记录保留其已验证状态。GitHub 不会重新验证先前签名的提交或根据密钥状态的变化追溯调整其验证状态。组织可能需要直接管理密钥状态以符合其安全策略,尤其是在计划频繁轮换或撤销密钥时。

验证记录的范围限定在其存储库网络

验证记录在其存储库网络中是持久的,这意味着如果同一提交再次推送到同一存储库或其任何分支,则将重用现有的验证记录。这允许 GitHub 在相关存储库中维护一致的已验证状态,而无需每次提交在网络中出现时都重新验证它。这种持久性增强了存储库网络中提交所有实例的提交真实性的统一且可靠的视图。

变基和合并的签名验证

在拉取请求中使用**变基和合并**选项时,请注意头部分支中的提交将添加到基础分支中,而无需提交签名验证。当您使用此选项时,GitHub 会使用原始提交的数据和内容创建修改后的提交。这意味着 GitHub 没有真正创建此提交,因此无法将其作为通用系统用户签名。GitHub 无法访问提交者的私有签名密钥,因此无法代表用户签名提交。

解决此问题的办法是在本地执行变基和合并,然后将更改推送到拉取请求的基础分支。

更多信息,请参阅“GitHub 上的合并方法”。

启用了警惕模式的状态

状态描述
已验证提交已签名,签名已成功验证,并且提交者是唯一启用了警惕模式的作者。
部分验证提交已签名,并且签名已成功验证,但提交的作者:a) 不是提交者,并且 b) 已启用警惕模式。在这种情况下,提交签名不能保证作者的同意,因此提交仅部分验证。
未验证满足以下任一条件
- 提交已签名,但无法验证签名。
- 提交未签名,并且提交者已启用警惕模式。
- 提交未签名,并且作者已启用警惕模式。

代码库管理员可以在分支上强制执行必需的提交签名,以阻止所有未签名和未验证的提交。更多信息,请参阅“关于受保护分支”。

您可以在 GitHub 上检查已签名提交或标签的验证状态,并查看提交签名未经验证的原因。更多信息,请参阅“检查您的提交和标签签名验证状态”。

GitHub 将自动使用 GPG 对您使用 Web 界面进行的提交进行签名。由 GitHub 签名的提交将具有已验证状态。您可以使用可在 https://github.com/web-flow.gpg 获取的公钥在本地验证签名。

您可以选择让 GitHub GPG 对您在 GitHub Codespaces 中进行的提交进行签名。有关为您的 Codespaces 启用 GPG 验证的更多信息,请参阅“管理 GitHub Codespaces 的 GPG 验证”。

GPG 提交签名验证

您可以使用 GPG 使用自己生成的 GPG 密钥对提交进行签名。

GitHub 使用 OpenPGP 库来确认您本地签名的提交和标签是否可以针对您已添加到 GitHub.com 上帐户的公钥进行加密验证。

要使用 GPG 签名提交并在 GitHub 上验证这些提交,请按照以下步骤操作

  1. 检查现有的 GPG 密钥
  2. 生成新的 GPG 密钥
  3. 将 GPG 密钥添加到您的 GitHub 帐户
  4. 告诉 Git 您的签名密钥
  5. 签名提交
  6. 签名标签

SSH 提交签名验证

您可以使用 SSH 使用自己生成的 SSH 密钥对提交进行签名。更多信息,请参阅 Git 参考文档 中的 user.Signingkey。如果您已经使用 SSH 密钥对 GitHub 进行身份验证,则也可以再次上传同一个密钥以用作签名密钥。您可以添加的签名密钥数量没有限制。

GitHub 使用 ssh_data(一个开源 Ruby 库)来确认您本地签名的提交和标签是否可以针对您已添加到 GitHub.com 上帐户的公钥进行加密验证。

注意

SSH 签名验证在 Git 2.34 或更高版本中可用。要更新您的 Git 版本,请参阅 Git 网站。

要使用 SSH 签名提交并在 GitHub 上验证这些提交,请按照以下步骤操作

  1. 检查现有的 SSH 密钥
  2. 生成新的 SSH 密钥
  3. 将 SSH 签名密钥添加到您的 GitHub 帐户
  4. 告诉 Git 您的签名密钥
  5. 签名提交
  6. 签名标签

S/MIME 提交签名验证

您可以使用 S/MIME 使用您的组织颁发的 X.509 密钥对提交进行签名。

GitHub 使用 Debian ca-certificates 包(与 Mozilla 浏览器使用的信任存储相同)来确认您本地签名的提交和标签是否可以针对受信任根证书中的公钥进行加密验证。

注意

S/MIME 签名验证在 Git 2.19 或更高版本中可用。要更新您的 Git 版本,请参阅 Git 网站。

要使用 S/MIME 签名提交并在 GitHub 上验证这些提交,请按照以下步骤操作

  1. 告诉 Git 您的签名密钥
  2. 签名提交
  3. 签名标签

您不需要将您的公钥上传到 GitHub。

机器人的签名验证

需要提交签名的组织和 GitHub Apps 可以使用机器人来签名提交。如果提交或标签具有可以加密验证的机器人签名,则 GitHub 会将提交或标签标记为已验证。

只有在请求已验证并已作为 GitHub App 或机器人进行身份验证,并且不包含任何自定义作者信息、自定义提交者信息和任何自定义签名信息(例如 Commits API)时,机器人的签名验证才能正常工作。

进一步阅读