Skip to main content

关于提交签名验证

使用 GPG、SSH 或 S/MIME,可以在本地对标记和提交进行签名。 这些标记或提交在 GitHub 上标示为已验证,便于其他人信任更改来自可信的来源。

关于提交签名验证

您可以在本地签署提交和标签,让其他人对您所做更改的源充满信心。 如果提交或标记具有可加密验证的 GPG、SSH 或 S/MIME 签名,GitHub 会将提交或标记标示为“已验证”或“部分验证”。

存储库提交列表中提交的屏幕截图。 “已验证”以橙色边框突出显示。

对于大多数个人用户,GPG 或 SSH 会是对提交进行签名的最佳选择。 在较大型组织的环境中通常需要 S/MIME 签名。 SSH 签名是最容易生成的。 甚至可以将现有身份验证密钥上传到 GitHub 以用作签名密钥。 生成 GPG 签名密钥比生成 SSH 密钥更复杂,但 GPG 具有 SSH 所没有的功能。 GPG 密钥可以在不再使用时过期或撤销。 GitHub 将已使用此类密钥进行签名的提交显示为“已验证”,除非密钥标记为已泄露。 SSH 密钥没有此功能。

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

对提交签名不同于提交签核。 有关如何签核提交的详细信息,请参阅“管理存储库的提交签字策略”。

默认状态

状态说明
已验证提交已签名且签名已成功验证。
未验证提交已签名,但签名无法验证。
无验证状态提交未签名。

变基和合并的签名验证

在拉取请求上使用“变基与合并”时,请务必注意,头分支中的提交将添加到基分支,无需提交签名验证。 使用此选项时,GitHub 会使用原始提交的数据和内容创建修改的提交。 这意味着 GitHub 未真正创建此提交,因此无法将其签名为通用系统用户。 GitHub 无权访问提交者的专用签名密钥,因此无法代表用户对提交进行签名。

解决方法是在本地进行变基和合并,然后将更改推送到拉取请求的基分支。

有关详细信息,请参阅“关于 GitHub 上的合并方法”。

启用了警戒模式的状态

状态说明
已验证提交已签名,签名已成功验证,并且提交者是启用警戒模式的唯一作者。
部分验证提交已签名,签名已成功验证,但提交的作者:a) 不是提交者,并且 b) 已启用警戒模式。 在这种情况下,提交签名并不保证作者的同意,因此提交只得到部分验证。
未验证以下任一项是正确的:
- 提交已签名,但签名无法验证。
- 提交未签名,并且提交者已启用警戒模式。
- 提交未签名,并且创建者已启用警戒模式。

仓库管理员可对分析实施必要的提交签名,以阻止未签名和验证的所有提交。 有关详细信息,请参阅“关于受保护分支”。

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

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

可以选择在 GitHub Codespaces 中使用 GitHub GPG 对你的提交进行签名。 有关为 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 密钥对提交进行签名。 有关详细信息,请查看 user.SigningkeyGit 参考文档。 如果已使用 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 证书包(Mozilla 浏览器使用的相同信任存储)确认你本地签名的提交和标记可根据受信任的根证书中的公钥加密验证。

注意:S/MIME 签名验证可用于 Git 2.19 或更高版本。 若要更新 Git 版本,请参阅 Git 网站。

要使用 S/MIME 对提交签名并在 GitHub 上验证这些提交,请执行以下步骤:

  1. 将你的签名密钥告诉 Git
  2. 对提交签名
  3. 对标记签名

无需将公钥上传到 GitHub。

自动程序的签名验证

需要提交签名的组织和 GitHub Apps 可使用自动程序对提交签名。 如果提交或标记具有密码可验证的自动程序签名,则 GitHub 会将提交或标记标示为已验证。

自动程序的签名验证仅在请求被验证为 GitHub App 或自动程序并且不含自定义作者信息、自定义提交者信息、自定义签名信息(如提交 API)时才有效。

延伸阅读