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

对于大多数个人用户而言,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 不会重新验证已签名的旧提交,也不会因密钥状态的变化而追溯性地调整其验证状态。组织可能需要直接管理密钥状态,以符合其安全策略,尤其在频繁轮换或撤销密钥的情况下。
验证记录的范围限于其仓库网络
验证记录在整个仓库网络中持久存在,这意味着如果同一提交再次被推送到同一仓库或其任何分支(包括 Fork),都会复用已有的验证记录。这样 GitHub 能在网络内的相关仓库之间保持一致的已验证状态,而无需每次出现时重新验证提交。此持久性强化了提交真实性在整个仓库网络中的统一可靠视图。
变基合并的签名验证
在拉取请求中使用Rebase and Merge选项时,需要注意的是,头分支中的提交会被添加到基分支中,而不会进行提交签名验证。使用此选项时,GitHub 会创建一个修改后的提交,使用原始提交的数据和内容。这意味着 GitHub 并未真正创建此提交,因而无法以通用系统用户的身份签名。GitHub 无法访问提交者的私有签名密钥,因而不能代表用户对提交进行签名。
一种解决办法是先在本地进行变基合并,然后将更改推送到拉取请求的基分支。
更多信息请参阅关于 GitHub 的合并方法。
启用警惕模式的状态
| 状态 | 描述 |
|---|---|
| 已验证 | 提交已签名,签名验证成功,且提交者是唯一已启用警惕模式的作者。 |
| 部分 验证 | 提交已签名,签名验证成功,但提交还有一位作者满足以下条件:a) 该作者不是提交者;b) 已启用警惕模式。在这种情况下,提交签名无法保证作者的同意,因此仅被标记为部分验证。 |
| 未验证 | 满足以下任意条件 - 提交已签名,但签名无法验证。 - 提交未签名且提交者已启用警惕模式。 - 提交未签名且作者已启用警惕模式。 |
仓库管理员可以在分支上强制要求提交签名,以阻止所有未签名或未验证的提交。更多信息请参阅关于受保护的分支。
您可以在 GitHub 上检查已签名的提交或标签的验证状态,并查看提交签名为何未通过验证的原因。更多信息请参阅检查你的提交和标签签名验证状态。
GitHub 会自动使用 GPG 对您通过网页界面创建的提交进行签名。由 GitHub 签名的提交将显示为已验证状态。您可以使用位于 https://github.com/web-flow.gpg 的公钥在本地验证该签名。
您也可以选择让 GitHub GPG 为您在 GitHub Codespaces 中的提交进行签名。有关在 Codespaces 中启用 GPG 验证的更多信息,请参阅管理 GitHub Codespaces 的 GPG 验证。
GPG 提交签名验证
您可以使用自行生成的 GPG 密钥对提交进行签名。
GitHub 使用 OpenPGP 库来确认您本地签名的提交和标签是否能够通过您在 GitHub.com 账户中添加的公钥进行加密验证。
要使用 GPG 对提交签名并在 GitHub 上获得验证,请按以下步骤操作
SSH 提交签名验证
您可以使用自行生成的 SSH 密钥对提交进行签名。更多信息请参阅 Git 参考文档 中的 user.Signingkey。如果您已经在使用 SSH 密钥与 GitHub 进行身份验证,也可以再次上传同一密钥以用作签名密钥。您可以向账户添加任意数量的签名密钥,没有数量限制。
GitHub 使用 ssh_data(一个开源的 Ruby 库)来确认您本地签名的提交和标签是否能够通过您在 GitHub.com 账户中添加的公钥进行加密验证。
注意
SSH 签名验证在 Git 2.34 及以上版本可用。要升级 Git 版本,请访问 Git 官方网站。
要使用 SSH 对提交签名并在 GitHub 上获得验证,请按以下步骤操作
S/MIME 提交签名验证
您可以使用组织颁发的 X.509 密钥通过 S/MIME 对提交进行签名。
GitHub 使用 Debian ca-certificates 包(与 Mozilla 浏览器使用的信任存储相同),来确认您本地签名的提交和标签是否能够通过受信任根证书中的公钥进行加密验证。
注意
S/MIME 签名验证在 Git 2.19 及以上版本可用。要升级 Git 版本,请访问 Git 官方网站。
要使用 S/MIME 对提交签名并在 GitHub 上获得验证,请按以下步骤操作
您无需将公钥上传至 GitHub。
机器人签名验证
需要提交签名的组织和 GitHub 应用可以使用机器人进行提交签名。如果提交或标签拥有可加密验证的机器人签名,GitHub 会将该提交或标签标记为已验证。
机器人签名验证仅在请求已作为 GitHub App 或机器人进行验证和身份验证且不包含自定义作者信息、自定义提交者信息以及自定义签名信息(如 Commits API)时才会生效。