如何在Python 2.7中安装OpenSSL 1.1.1?

10

我在一台Windows 10电脑上安装了Python 2.7.17。接下来,我想通过在Python中运行以下命令来测试其OpenSSL版本:

import ssl
print ssl.OPENSSL_VERSION_INFO

我正在获得(1, 0, 2, 20, 15)。 我想要升级到版本1.1.1。 运行pip freeze命令后,我得到了如下结果:

cffi==1.14.0
cryptography==2.8
enum34==1.1.6
ipaddress==1.0.23
pycparser==2.19
pyOpenSSL==19.1.0
six==1.14.0

这些似乎是pyOpenSSL和cryptography中最新的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']

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


你使用Python2.7的原因是什么?因为它已经不再受支持了,你应该使用Python3。 - Uli Sotschok
@UliSotschok 因为使用这个 Python 的应用程序不支持 Python 3,而且可能永远都不会支持... - Assaf Mendelson
py -m OpenSSL.debug 的输出是什么?你尝试更新了列出的每个模块了吗? - Arn
你想使用 OpenSSL 1.1.1 的哪些模块,但它们没有被使用? - CristiFati
@CristiFati 我正在使用的应用程序使用 pyOpenSSL。正如所述,正确版本的验证是通过导入ssl然后打印ssl.OPENSSL_VERSION_INFO来完成的。我应该看到1.1.1或更高版本。 - Assaf Mendelson
1个回答

6
唯一的方法是重新编译Python 2.7,并使用当前的OpenSSL 1.1.1d版本来为其ssl模块提供支持。对于*nix平台而言,这并不太难;它只涉及一些初始配置文件的调整。在macOS上进行了快速测试后发现,Python 2.7源代码实际上与OpenSSL 1.1.1d API兼容,因此看起来很有希望。
然而,在Windows上使用OpenSSL 1.1.1d重新构建Python 2.7比较困难。这是因为构建系统依赖于Microsoft的msbuild,而其调整起来不像*nix上基于make的构建系统那样容易。您可以在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"

对于32位版本,或者

> build --no-tkinter --no-bsddb -e -p x64 "/p:PlatformToolset=v141"

进行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

除此之外,我没有进行任何测试。


总的来说,实现这些更改包括:

  • 从解决方案中删除libeay项目。这个项目用于从源代码构建OpenSSL 1.0.2,但它与OpenSSL 1.1.1不兼容。相反,该解决方案现在依赖于Python存储库中提供的预编译的OpenSSL 1.1.1d二进制文件,在cpython-bin-deps中提供。重建OpenSSL作为构建过程的一部分是可能的,但需要进行更多修改。
  • 修改了get_externals.bat批处理脚本,以从前面提到的cpython-bin-deps存储库下载OpenSSL 1.1.1d预编译库。
  • 修改了openssl.props属性文件,该文件配置了几个_ssl_hashlib项目设置,并对这些项目本身也进行了一些更改。这些调整主要来自Python的v3.8.1版本,以链接新的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 中运行构建命令来重现构建过程,就像上面提到的那样。如果有足够多的人感兴趣,我可能会整理一下并保留它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接