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

Sigstore 信息

背景

Python 3.11.0Python 3.10.7Python 3.9.14Python 3.8.14Python 3.7.14 版本开始,CPython 发布工件还会使用 Sigstore 进行签名(除了现有的 GPG 签名之外)。

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

使用 Sigstore 验证 CPython 版本

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

最后,验证需要一个 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 的技巧。

请使用上表选择每个 Python 发布版本预期的签名身份和 OIDC 颁发者,而不是使用 GPG 密钥进行验证。

在使用 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 包,我们建议使用 sigstore-go

有关本指南的任何问题,请报告至 https://github.com/sigstore/sigstore-python/issues