Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 546 – Backport ssl.MemoryBIO 和 ssl.SSLObject 到 Python 2.7

作者:
Victor Stinner <vstinner at python.org>, Cory Benfield <cory at lukasa.co.uk>
BDFL 委托
Benjamin Peterson <benjamin at python.org>
状态:
已拒绝
类型:
标准跟踪
创建日期:
2017年5月30日
Python 版本:
2.7
发布历史:
2017年5月23日
决议:
Python-Dev 消息

目录

摘要

将 Python 3 中的 ssl.MemoryBIO 和 ssl.SSLObject 类 backport 到 Python 2.7,以增强 Python 2.7 的整体安全性。

拒绝通知

此 PEP 已被拒绝,请参阅 Withdraw PEP 546? Backport ssl.MemoryBIO and ssl.SSLObject to Python 2.7 的讨论以了解原因。

基本原理

虽然 Python 2.7 即将结束支持(计划于 2020 年),但它仍在生产系统中使用,Python 社区仍对其安全性负责。此 PEP 将有助于促进 PEP 543 在所有支持的 Python 版本中的未来采用,从而提高 Python 2 和 Python 3 用户安全性。

此 PEP **不** 提议对 backport 新功能到 Python 2.7 进行普遍豁免 - 任何提议 backport 的新功能仍需要独立证明其合理性。特别是,需要解释为什么依赖于 Python 包索引上独立更新的 backport 不是一个可接受的解决方案。

PEP 543

PEP 543 定义了一个新的 Python TLS API,它将通过允许 Python 应用程序访问 Windows 和 macOS 上的原生 TLS 实现,而不是使用 OpenSSL,来增强 Python 的安全性。其副作用是它允许访问系统信任存储和系统管理员本地安装的证书,使 Python 应用程序能够使用“公司证书”,而无需修改每个应用程序,从而正确验证 TLS 证书(而不是忽略或绕过 TLS 证书验证)。

出于实际原因,Cory Benfield 希望首先为 PEP 543 实现一个类似 ssl.MemoryBIO 和 ssl.SSLObject 的无 I/O 类,并在此基础上提供一个使用套接字或文件描述符的第二个类。这种设计将有助于构建代码以支持更多后端,简化测试和审计,以及实现。稍后,可能会添加使用套接字或文件描述符的优化类以提高性能。

虽然 PEP 543 定义了一个 API,但只有当它附带至少一个完整且良好的实现时,该 PEP 才有意义。理想情况下,第一个实现将基于 Python 标准库的 ssl 模块,因为该模块默认随所有用户分发,并且可以在没有更具针对性的实现时用作备用实现。

如果未执行此 backport,唯一可用的基础实现将是 pyOpenSSL。然而,这存在问题,因为它会与 pip 交互,而 pip 是随所有受支持版本的 CPython 分发的。

requests, pip 和 ensurepip

目前有计划研究将 Requests 迁移到更面向事件循环的模型。Requests 团队目前不认为可以放弃对 Python 2.7 的支持,因此这样做将需要使用 Twisted 或 Tornado,或者编写自己的异步抽象。

对于异步代码,MemoryBIO 与使用包装套接字相比具有显著优势。它减少了必须进行的缓冲量,可以在基于 IOCP 的反应器以及基于 select/poll 的反应器上工作,并且还大大简化了反应器和实现代码。因此,Requests 不愿使用基于包装套接字实现的方案。在没有 backport 到 Python 2.7 的情况下,Requests 被要求使用与 Twisted 相同的解决方案:即,强制依赖 pyOpenSSL

出于实际原因,pip 程序必须嵌入其所有依赖项:即,它不能依赖于任何其他安装方法。由于 pip 依赖于 requests,这意味着它必须嵌入 pyOpenSSL 的副本。这将导致安装 pip 时出现显著的可用性问题。目前,pip 不支持嵌入必须在每个平台上编译的 C 扩展,因此需要 C 编译器。

自 Python 2.7.9 起,Python 就嵌入了 pip 的副本,用于默认安装以及通过新的 ensurepip 模块在虚拟环境中使用。如果 pip 最终捆绑 PyOpenSSL,那么 CPython 将会捆绑 PyOpenSSL。只有 backport ssl.MemoryBIOssl.SSLObject 才能避免嵌入 pyOpenSSL 的需要,并解决引导问题(python -> ensurepip -> pip -> requests -> MemoryBIO)。

这种情况比 PEP 543 采用的障碍问题要小,因为 Requests 自然不必在放弃对 Python 2.7 支持之前就迁移到事件循环模型。然而,只要它继续支持 Python 2,它就会使 Requests(和 pip)在同时支持 asyncio 以及 asyncawait 关键字时变得痛苦。

其他好处

采纳此 PEP 将带来其他一些较小的生态系统效益。例如,Twisted 将能够减少对第三方 C 扩展的依赖。此外,PyOpenSSL 开发团队希望淘汰该模块,此 backport 将使他们能够以一种优雅的方式做到这一点,而不会让他们的用户陷入困境。

所有这些零星的好处,虽然微小,但也为更广泛的 Python 生态系统带来了价值。

关注点

人们对这个 backport 存在一些担忧。

旧的 Python 2 怎么办?

世界上许多 Python 2 用户跟不上 Python 2 的发布节奏。这通常是因为他们使用的是未跟上 Python 2 次要版本发布的 LTS 版本。这些用户将无法使用 MemoryBIO,因此关注 Python 2 兼容性的项目可能无法在他们的大多数用户系统上依赖 MemoryBIO 的存在。

这种担忧是合理的。它有多关键取决于当前 Python 2 用户迁移到 Python 3 的可能性,或者他们只是尝试使用最新版本的 Python 2。换句话说,总有一天库会想要放弃 Python 2 支持:问题只在于,在他们放弃支持之前,他们的 Python 2 用户中是否有很大一部分已经迁移到包含此 backport 的 Python 2 版本。

最终,此 PEP 的作者认为此 backport 的负担足够小,值得在考虑此担忧后进行 backport。如果事实证明迁移到较新的 2.7 版本过于缓慢,那么这项工作的价值将很小,但如果迁移到较新的 2.7 版本是合理的,那么将获得巨大的价值。

更改

MemoryBIOSSLObject 类添加到 Python 2.7 的 ssl 模块中。

代码将从 master 分支(Python 3)进行 backport 和改编。

此 backport 还显著减小了 _ssl 模块在 Python 2/Python 3 之间的差异,这使得维护更加容易。

讨论


来源: https://github.com/python/peps/blob/main/peps/pep-0546.rst

最后修改: 2025-02-01 08:59:27 GMT