注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

Sigstore 信息

Python 3.11.0Python 3.10.7Python 3.9.14Python 3.8.14Python 3.7.14 版本开始,CPython 发布工件额外使用 Sigstore 进行签名。

从 Python 3.14 开始,Sigstore 是发布工件签名和验证的唯一方法。早于 3.14 系列的 Python 版本还包括可以使用 公钥验证 的传统 OpenPGP 签名。有关此更改的更多信息,请参阅 PEP 761

此页面提供作为 CPython 用户验证 Sigstore 签名的指导,并概述了使用这些额外签名的一些动机。

CPython 版本的 Sigstore 验证

Sigstore 简介

Sigstore 是一个用于签名、验证和保护软件的新标准。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