如何为 python 2.7 安装 openssl 1.1.1?

Ass*_*son 9 python openssl pyopenssl python-2.7 windows-10

我在 Windows 10 机器上安装了 python 2.7.17。然后我想通过在 python 中运行以下命令来测试它的 openssl 版本:

import ssl
print ssl.OPENSSL_VERSION_INFO
Run Code Online (Sandbox Code Playgroud)

(1, 0, 2, 20, 15) 想升级到 1.1.1 版。做点冻结我得到:

import ssl
print ssl.OPENSSL_VERSION_INFO
Run Code Online (Sandbox Code Playgroud)

这些似乎是 pyOpenSSL 和密码学的最新 pip。

我安装的 openssl(作为 git bash 的一部分)是 1.1.1,但是,这与 python 中使用的版本不同。

如何将 python 中包含的 openssl 版本升级到 1.1.1 或更高版本?

编辑: 为了回应评论,以下是 python -m OpenSSL.debug 的结果:

C:\Users\assaf>python -m OpenSSL.debug
pyOpenSSL: 19.1.0
cryptography: 2.8
cffi: 1.14.0
cryptography's compiled against OpenSSL: OpenSSL 1.1.1d  10 Sep 2019
cryptography's linked OpenSSL: OpenSSL 1.1.1d  10 Sep 2019
Pythons's OpenSSL: OpenSSL 1.0.2t  10 Sep 2019
Python executable: C:\Python27\python.exe
Python version: 2.7.17 (v2.7.17:c2f86d86e6, Oct 19 2019, 21:01:17) [MSC v.1500 64 bit (AMD64)]
Platform: win32
sys.path: ['', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']
Run Code Online (Sandbox Code Playgroud)

如上所述,密码学和 pyOpenSSL 是最新的 pip。

Rei*_*eek 5

让 Python 2.7 为其ssl模块使用当前 OpenSSL 1.1.1d 版本的唯一方法是使用该版本的 OpenSSL 重建它。对于 *nix 平台,这并不太难;它只涉及调整一些初始配置文件。在 macOS 上进行的快速测试表明,Python 2.7 源代码实际上与 OpenSSL 1.1.1d API 兼容,因此看起来很有希望。

但是,对于 Windows,使用 OpenSSL 1.1.1d 重建 Python 2.7 更加困难。这是因为依赖于 Microsoft 的构建系统msbuild不像make*nix 上的基于 的构建系统那么容易调整。您可以在Python 的PCbuild子目录中看到相关的 Visual Studio 解决方案、项目和属性文件。

此外,Windows 上的 OpenSSL 1.0.2 和 1.1.1 版本之间的差异稍大,因为库名称也发生了变化,而 *nix 版本则保持不变。

不过,对 Windows 的 Python 构建系统所需的修改并不太广泛。在做出本答案底部解释的更改后,我似乎能够实现您的目标。实际的构建可以通过从 Python 的PCbuild子目录运行以下命令来完成:

> build --no-tkinter --no-bsddb -e "/p:PlatformToolset=v141"
Run Code Online (Sandbox Code Playgroud)

对于 32 位构建,或

> build --no-tkinter --no-bsddb -e -p x64 "/p:PlatformToolset=v141"
Run Code Online (Sandbox Code Playgroud)

对于 64 位构建。这些--no-选项用于加快进程并专注于 OpenSSL 方面。v141代表 Visual Studio 2017,你需要在 Visual Studio shell 中才能工作。之后,以下内容重现了您的测试,显示了在 Python 2.7.17 中使用 OpenSSL 1.1.1d:

> win32\python.exe
Python 2.7.17 (tags/v2.7.17-dirty:c2f86d86e6, Feb 20 2020, 01:04:36) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> print ssl.OPENSSL_VERSION
OpenSSL 1.1.1d  10 Sep 2019
Run Code Online (Sandbox Code Playgroud)

除此之外我没有做任何测试。


总之,实现这一目标的变化包括

  • 从解决方案中删除了libeay项目。这用于从源代码构建 OpenSSL 1.0.2,但它与 OpenSSL 1.1.1 不兼容。相反,该解决方案现在依赖于cpython-bin-deps 中的 Python 存储库提供的预构建 OpenSSL 1.1.1d 二进制文件。作为构建过程的一部分,自己重建 OpenSSL 是可能的,但需要更多的修改。
  • 修改get_externals.bat批处理脚本以从上述 cpython-bin-deps 存储库下载 OpenSSL 1.1.1d 预构建库。
  • 修改后的openssl.props属性文件配置若干台的_ssl_hashlib项目设置,并做了一些修改这些项目本身以及。调整主要来自v3.8.1Python的发布,以链接新的 OpenSSL 库并正确设置包含路径。通过此修改,OpenSSL 不再像以前在 2.7.17 中那样静态链接,而是动态链接。
  • 对文件应用补丁Modules/posixmodule.cModules/timemodule.c此补丁类似,以允许使用 Visual Studio 2017 进行构建——与创建预构建 OpenSSL 二进制文件的版本相同。

顺便说一下,在当前的构建过程中下载了比需要更多的东西,包括 OpenSSL 和 nasm 源代码。这只是为了尽可能少地修改原始构建脚本。

如果你对细节感兴趣,你可以在 cpython 存储库的这个分支中查看相关的提交,我这样做只是为了澄清我的答案。它基于原始标签v2.7.17。如上所述,您应该能够通过检出该分支v2.7.17_ossl_1.1.1并运行构建命令来重现构建PCbuild。如果有足够多的人感兴趣,我可能会清理它并保留它。