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

Python 增強提案

PEP 644 – 要求 OpenSSL 1.1.1 或更高版本

作者:
Christian Heimes <christian at python.org>
討論至:
Discourse 帖子
狀態:
最終版
型別:
標準跟蹤
建立日期:
2020年10月27日
Python 版本:
3.10
釋出歷史:
2020年10月27日,2021年3月3日,2021年3月17日,2021年4月17日
決議:
Python-Dev 訊息

目錄

摘要

本PEP提議CPython的標準庫只支援OpenSSL 1.1.1 LTS或更高版本。對已過生命週期、不相容的fork以及其他TLS庫的支援將被放棄。

動機

Python在 hashlibhmacssl 模組中使用了OpenSSL。OpenSSL提供了加密原語的快速實現以及一個完整的TLS堆疊,包括X.509證書的處理。ssl 模組被標準庫模組(如 urllib)和第三方模組(如 urllib3)用於實現網際網路協議的安全變體。pip 使用 ssl 模組從PyPI安全下載軟體包。ssl 模組繫結OpenSSL的任何bug都可能導致嚴重的安全問題。

隨著時間的推移,OpenSSL的公共API不斷演變和變化。版本1.0.2引入了新的API來驗證和匹配主機名。OpenSSL 1.1.0使內部結構不透明,並引入了新的API來取代對結構成員的直接訪問。版本3.0.0將因內部重組而廢棄更多API,這些重組將加密演算法從核心移到提供者中。LibreSSL和BoringSSL等fork已經朝不同的方向發展。

目前,Python 3.6至3.9版本與OpenSSL 1.0.2、1.1.0和1.1.1相容。在大多數情況下,Python也與LibreSSL >= 2.7.1相容,但缺少一些功能和一些測試失敗。

由於資源和時間有限,支援多個版本和分支,以及測試和驗證正確性變得越來越困難。除了多個不相容的API之外,還有構建時標誌、特定於發行版的補丁以及本地加密策略設定,這些都增加了組合的複雜性。另一方面,Python核心團隊只有少數熟悉TLS和OpenSSL內部的領域專家,而活躍的維護者更少。

要求使用 OpenSSL 1.1.1 將使我們能夠為絕大多數使用者提供更好的體驗,減少我們的維護開銷,從而釋放資源來實施新功能。使用者將能夠依賴新功能的出現和一致的行為,最終帶來更強大的體驗。

影響

OpenSSL 1.1.1 是幾乎所有受支援的平臺和發行版上的 OpenSSL 預設變體和版本。它也是唯一仍受上游安全支援的版本 [9]

macOS 和 Windows 使用者不會受到此棄用的影響。python.org 安裝程式和 Conda 等替代發行版均隨附最新的 OpenSSL 版本。

截至2020年10月,根據DistroWatch [1],大多數當前的BSD和Linux發行版也隨附OpenSSL 1.1.1。一些長期支援(LTS)和企業發行版的舊版本有較舊的OpenSSL或LibreSSL版本。到Python 3.10普遍可用時,其中一些發行版將達到生命週期結束、通用支援結束,或從LibreSSL轉向OpenSSL。

其他軟體也已放棄對 OpenSSL 1.0.2 的支援。例如,PyCA cryptography 3.2 (2020-10-25) 移除了與 OpenSSL 1.0.2 的相容性。

OpenSSL 1.0.2 LTS

釋出:2015-02 生命週期結束:2019-12

OpenSSL 1.0.2 添加了主機名驗證、ALPN 支援和橢圓曲線。

  • CentOS 7 (EOL 2024-06)
  • Debian 8 Jessie (EOL 2020-07)
  • Linux Mint 18.3 (EOL 2021-04)
  • RHEL 7 (全面支援於 2019-08 結束,維護 2 支援於 2024-06 結束)
  • SUSE Enterprise Linux 12-SP5 (通用支援於 2024-10 結束)
  • Ubuntu 16.04 LTS / Xenial (通用支援於 2021-04 結束)

OpenSSL 1.1.0

釋出:2016-08 生命週期結束:2019-09

OpenSSL 1.1.0 預設移除或停用了不安全的密碼,並增加了對 ChaCha20-Poly1305、BLAKE2 (基本功能)、X25519 和 CT 的支援。大多數結構變得不透明,並引入了新的 API。OpenSSL 1.1.0 與 1.0.2 不相容 API。

  • Debian 9 Stretch (安全支援於 2020-07 結束,LTS 直到 2022-06)
  • Ubuntu 18.04 LTS / Bionic (通用支援於 2023-04 結束)

OpenSSL 1.1.1 LTS

釋出:2018-08 生命週期結束:2023-09(計劃)

OpenSSL 1.1.1 添加了 TLS 1.3、SHA-3、X448 和 Ed448。

  • Alpine(2018年切換回OpenSSL [4]
  • Arch Linux 當前
  • CentOS 8.0+
  • Debian 10 Buster
  • Debian 11 Bullseye (預計於 2021-06 釋出)
  • Fedora 29+
  • FreeBSD 11.3+
  • Gentoo Linux 穩定版(於 2021 年 1 月停止將 LibreSSL 作為替代方案 [10]
  • HardenedBSD(2018年切換回OpenSSL [3]
  • Linux Mint 19.3+
  • macOS (python.org 安裝程式)
  • NetBSD 8.2+
  • openSUSE 15.2+
  • RHEL 8.0+
  • Slackware 當前
  • SUSE Enterprise Linux 15-SP2
  • Ubuntu 18.10+
  • Ubuntu 20.04 LTS / Focal
  • VoidLinux (於 2021 年 3 月切換回 OpenSSL [5])
  • Windows (python.org 安裝程式, Conda)

主要的 CI 提供商提供帶有 OpenSSL 1.1.1 的映象。

  • AppVeyor(使用映象 Ubuntu2004
  • CircleCI(使用最新的 cimg/base:stablecimg/base:stable-20.04
  • GitHub Actions(使用 runs-on: ubuntu-20.04
  • Giblab CI(使用 Debian Stretch, Ubuntu Focal, CentOS 8, RHEL 8, 或 Fedora runner)
  • Packit
  • TravisCI(使用 dist: focal
  • Zuul

OpenSSL 3.0.0

釋出:不適用(計劃於 2021 年中/末)

OpenSSL 3.0.0 目前正在開發中。主要變化包括重新授權為 Apache License 2.0,以及為加密演算法提供商提供新的 API。大多數變化是內部重構,不影響公共 API。[8]

LibreSSL

建立:2014-04(從 OpenSSL 1.0.1g 分支)

  • DragonFly BSD
  • Hyperbola GNU/Linux-libre
  • OpenBSD
  • OpenELEC(已停產)
  • TrueOS(已停產)

一些發行版,如 FreeBSD 和 OPNsense,也採用 LibreSSL 而非 OpenSSL 作為非標準 TLS 庫。Gentoo 於 2021 年 1 月停止將 LibreSSL 作為 OpenSSL 的替代品 [10],原因是相容性問題和測試不足。

OpenBSD ports 有一個埠 security/openssl/1.1,其文件記載為“[…] 旨在為無法與 LibReSSL 相容的應用程式提供支援” [7]。OpenBSD 可以使用該軟體包來提供一個可用的 ssl 模組。

BoringSSL

建立時間:2014-06

BoringSSL 是 Google 的 OpenSSL 分支。它不打算用於一般用途,因此不受 Python 支援。無法保證 API 或 ABI 的穩定性。Chrome/Chromium 瀏覽器、Android 和 Apple 平臺都使用了 BoringSSL 的打包副本 [6]

好處

TLS 1.3

OpenSSL 1.1.1 引入了對新版 TLS 1.3 的支援。最新版本的 TLS 協議握手速度更快,並且比以前的版本更安全。

執行緒和fork安全

從 1.1.0c 版本開始,OpenSSL 完全支援 fork 和執行緒安全。繫結不再需要任何變通方法或額外的回撥來支援多執行緒。

SHA-3

自 1.1.0 起,OpenSSL 附帶 SHA-3 和 SHAKE 實現。Python 的內建 SHA-3 支援基於參考實現。內部 _sha3 程式碼相當大,生成的共享庫接近 0.5 MB。Python 可以放棄內建實現,轉而依賴 OpenSSL 的 libcrypto

迄今為止,LibreSSL 上游開發拒絕新增 SHA-3 支援。[2]

相容性

OpenSSL 下游補丁和選項

OpenSSL 提供了超過 70 個配置和構建時選項,形式為 OPENSSL_NO_* 宏。大約 60 個選項影響加密演算法和 TLS 版本等功能的可用性。有些發行版會應用補丁來更改設定。此外,安全級別、密碼、TLS 版本範圍和簽名演算法等設定的預設值可以在 OpenSSL 配置檔案中設定。

Python 核心團隊缺乏測試所有可能組合的資源。本 PEP 建議 Python 僅支援啟用標準功能的 OpenSSL 構建。供應商應使用構建時選項(如 OPENSSL_NO_TLS1_1_METHOD)或 OpenSSL 配置選項(如 MinProtocol = TLSv1.2)停用已棄用或不安全的演算法和 TLS 版本。

Python 假定 OpenSSL 的構建包含:

  • hashlib 的預設演算法,如 MD5、SHA-1、SHA-2 家族、SHA-3/SHAKE 家族、BLAKE2
  • TLS 1.2 和 TLS 1.3 協議
  • 用於 TLS 1.2 和 1.3 的當前金鑰協商、簽名和加密演算法(ECDH、RSA、ECDSA、Curve25519、AES、Poly1309-ChaCha20 等)
  • 執行緒、檔案 I/O、套接字 I/O 和錯誤訊息

弱演算法(MD5、SHA-1 簽名)和短金鑰(RSA < 2024 位)可以在執行時停用。演算法也可能因加密策略(如 FIPS)停用而被阻止。本 PEP 故意不更具體,以留出空間用於新功能以及應對漏洞的對策。通常來說,Python 應該能夠連線到 PyPI,並且測試套件應該透過。

LibreSSL 支援

LibreSSL 是 OpenSSL 的一個分支。在 2014 年,OpenBSD 團隊的成員針對 Heartbleed 漏洞從 OpenSSL 1.0.1g 建立了這個分支。自其成立以來,一些被認為有問題或不安全的功能被移除或替換(SSL 2.0、SSL 3.0、改進的 CPRNG)或從 OpenSSL 和 BoringSSL 反向移植。

目前,LibreSSL 與 OpenSSL 1.1.1 並非完全 API 相容。最新版本 LibreSSL 3.3.2 缺少一些功能,並且在某些情況下行為有所不同。值得注意的缺失或不相容功能包括

  • SHA-3、SHAKE、BLAKE2
  • SSL_CERT_* 環境變數
  • 安全級別 API
  • 會話處理 API
  • 金鑰日誌 API
  • 已驗證的證書鏈 API
  • OPENSSL_VERSION 宏

本 PEP 提議從 Python 中移除所有與 LibreSSL 相關的變通方案。將來,Python 將不會透過配置和編譯時檢查主動禁止 LibreSSL 支援。但 Python 也不會接受新增非平凡變通方案或停用測試的補丁。

BoringSSL

目前沒有支援 BoringSSL 的計劃。

被拒絕的想法

正式支援的 OpenSSL 版本

本 PEP 未提供一套正式的規則和條件來定義支援 OpenSSL 版本的標準。

通常,Python 旨在與常用且官方支援的 OpenSSL 版本相容。Python 的補丁版本可能與 OpenSSL 的新主要版本不相容。使用者不應期望 Python 的新主要或次要版本能與已過生命週期的 OpenSSL 版本一起工作。Python 核心開發團隊可能會為新版本向後移植修復或根據需要擴充套件與已達 EOL 版本的相容性。

OpenSSL 的新 ABI 穩定性和 LTS 策略 [9] 也應該有所幫助。

保留對 OpenSSL 1.1.0 的支援

有人建議保留對 OpenSSL 1.1.0 的支援,以相容 Debian 9 (Stretch)。該提議被駁回,因為它會使程式碼清理和測試複雜化。Stretch 已經超出常規安全支援,並接近長期支援的末尾。到 Python 3.10 最終釋出時,Debian Buster 和 Debian Bullseye 將可用。

相反,Python 3.10 將增加額外的文件和一個新的 configure 選項 --with-openssl-rpath=auto,以簡化自定義 OpenSSL 構建的使用 [11]

向後相容性

Python 3.10 將不再支援使用 OpenSSL 1.0.2 或 LibreSSL 的平臺上的 TLS/SSL 和快速雜湊。本 PEP 的初稿在 3.10 釋出週期的開始釋出,以便 Linux 發行版或 CI 提供商等供應商有足夠的時間進行規劃。

Python 內部的 Keccak Code Package 副本和內部的 _sha3 模組將被移除。這將使原始碼大小減少約 280KB,程式碼大小減少約 0.5MB。hashlib 將完全依賴 OpenSSL 的 SHA-3 實現。沒有 OpenSSL 將不再提供 SHA-3 和 SHAKE。

免責宣告和特別感謝

本 PEP 的作者是 OpenSSL 專案的貢獻者,受僱於一家使用 OpenSSL 的主要 Linux 發行商。

感謝 Alex Gaynor、Gregory P. Smith、Nathaniel J. Smith、Paul Kehrer 和 Seth Larson 對初稿的審閱和反饋。

參考資料


來源:https://github.com/python/peps/blob/main/peps/pep-0644.rst

最後修改:2025-02-01 08:55:40 GMT