跳至主要内容

关于提交签名验证

使用 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 密钥可以在不再使用时过期或被吊销。GitHub 会将使用此类密钥签名的提交显示为“已验证”,除非该密钥被标记为已泄露。SSH 密钥没有此功能。

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

签名提交不同于签署提交。有关签署提交的详细信息,请参阅“管理存储库的提交签署政策”。

默认状态

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

重新提交和合并的签名验证

在拉取请求中使用重新提交和合并选项时,请务必注意,主分支中的提交会添加到基础分支中,而不会进行提交签名验证。当您使用此选项时,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. 向你的 GitHub 帐户添加 GPG 密钥
  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. 向你的 GitHub 帐户添加 SSH 签名密钥
  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 应用可以使用机器人来签名提交。如果提交或标记具有加密可验证的机器人签名,GitHub 会将该提交或标记标记为已验证。

机器人的签名验证仅在请求被验证并认证为 GitHub 应用或机器人,并且不包含任何自定义作者信息、自定义提交者信息以及任何自定义签名信息(例如提交 API)时才有效。

延伸阅读