Sigstore 信息
背景
从 Python 3.11.0、Python 3.10.7、Python 3.9.14、Python 3.8.14 和 Python 3.7.14 版本开始,CPython 发布工件还会使用 Sigstore 进行签名(除了现有的 GPG 签名之外)。
本页提供了有关作为 CPython 用户如何验证 Sigstore 签名的指导,并概述了使用这些额外签名的一些动机。
使用 Sigstore 验证 CPython 版本
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 |
最后,验证需要一个 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