Sigstore 信息
从 Python 3.11.0、Python 3.10.7、Python 3.9.14、Python 3.8.14 和 Python 3.7.14 版本开始,CPython 发布工件额外使用 Sigstore 进行签名。
从 Python 3.14 开始,Sigstore 是发布工件签名和验证的唯一方法。早于 3.14 系列的 Python 版本还包括可以使用 公钥验证 的传统 OpenPGP 签名。有关此更改的更多信息,请参阅 PEP 761。
此页面提供作为 CPython 用户验证 Sigstore 签名的指导,并概述了使用这些额外签名的一些动机。
CPython 版本的 Sigstore 验证
Sigstore 简介
Sigstore 是一个用于签名、验证和保护软件的新标准。Sigstore 项目是一组工具和服务
- 一个证书颁发机构
- 一个签名透明日志
- 多个生态系统特定的签名客户端(例如 https://pypi.ac.cn/p/sigstore/)
从高层次来看,Sigstore 使用证书颁发机构将 OpenID Connect (OIDC) 身份与临时密钥绑定,并使用透明日志发布签名事件的结果。这消除了签名者管理私钥的需要。它还允许用户根据 OIDC 身份的特征(例如电子邮件地址)验证签名。
Sigstore 文档中提供了有关签名过程以及这些工具和服务之间相互作用的更多详细信息。此外,此处可以找到 Sigstore 的安全模型。
使用 Sigstore 验证 CPython 发布工件
验证需要存在两个文件:相关发布工件和捆绑的“验证材料”,后者通常具有文件扩展名 .sigstore。例如,对于 Python 3.11.0 源代码发布,您将下载以下文件
$ wget https://pythonlang.cn/ftp/python/3.11.0/Python-3.11.0.tgz
$ wget https://pythonlang.cn/ftp/python/3.11.0/Python-3.11.0.tgz.sigstore
这些验证材料应存在于所有发布工件中,并与它们对应的工件一起列在下载页面上。
验证还需要事先了解签名者的身份。对于 CPython 版本,这些是给定版本的发布经理的电子邮件地址。当前和即将发布的版本的发布经理如下
| 版本 | PEP | 发布经理 | OIDC 颁发者 |
|---|---|---|---|
| 3.7 | PEP 537 | nad@python.org |
https://github.com/login/oauth |
| 3.8 | PEP 569 | lukasz@langa.pl |
https://github.com/login/oauth |
| 3.9 | PEP 596 | lukasz@langa.pl |
https://github.com/login/oauth |
| 3.10 | PEP 619 | pablogsal@python.org |
https://# |
| 3.11 | PEP 664 | pablogsal@python.org |
https://# |
| 3.12 | PEP 693 | thomas@python.org |
https://# |
| 3.13 | PEP 719 | thomas@python.org |
https://# |
| 3.14 | PEP 745 | hugo@python.org |
https://github.com/login/oauth |
| 3.15 | PEP 790 | hugo@python.org |
https://github.com/login/oauth |
| 3.16 | savannah@python.org |
https://github.com/login/oauth |
|
| 3.17 | savannah@python.org |
https://github.com/login/oauth |
最后,验证需要一个 Sigstore 客户端。建议使用 https://pypi.ac.cn/p/sigstore/
要通过包括哈希检查和版本锁定在内的额外安装时保证进行安装,您可以运行以下命令从完全指定的 requirements 文件进行安装
$ python -m pip install -r https://raw.githubusercontent.com/sigstore/sigstore-python/main/install/requirements.txt
或者,在没有这些保证的情况下照常安装
$ python -m pip install sigstore
最后,在您下载发布工件和验证材料的目录中,您可以运行以下命令
$ python -m sigstore verify identity \
--bundle Python-3.11.0.tgz.sigstore \
--cert-identity pablogsal@python.org \
--cert-oidc-issuer https://# \
Python-3.11.0.tgz
运行此命令应导致输出 OK: Python-3.11.0.tgz,这表示签名有效。
从 GPG 签名迁移
在 Sigstore 签名可用之前,CPython 还提供 GPG 签名作为验证工件来源和完整性的手段。以下是一些将现有使用 GPG 验证的配置迁移到采用 Sigstore 的技巧。
无需使用 GPG 密钥进行验证,而是使用上表选择每个 Python 版本预期的签名身份和 OIDC 颁发者。
在工件使用 GPG 验证后,通常会将工件固定到特定的校验和值,如 SHA-256。如果此值已经可用,则可以使用 Sigstore 仅使用工件校验和检查工件校验和的有效性。例如,使用校验和 deadbeef...
$ python -m sigstore verify identity \
--bundle Python-3.11.0.tgz.sigstore \
--cert-identity pablogsal@python.org \
--cert-oidc-issuer https://# \
sha256:deadbeef...
验证工件校验和需要最新版本的 sigstore-python,至少 v3.3.0 或更高版本。
离线验证是验证 Sigstore 捆绑包(即 .sigstore)时的默认设置。使用 --offline 选项禁用其他网络调用,例如更新 TUF 元数据。
如果需要独立二进制文件而不是用于验证签名的 Python 包,我们建议使用 cosign。
本指南中的任何问题都可以报告到 https://github.com/sigstore/sigstore-python/issues
