【问题标题】:How to install openssl 1.1.1 for python 2.7?如何为 python 2.7 安装 openssl 1.1.1?
【发布时间】:2020-05-29 12:17:00
【问题描述】:

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

import ssl
print ssl.OPENSSL_VERSION_INFO

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

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 和密码学的最新 pip。

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

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

编辑: 针对cmets,以下是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']

如上所述,cryptography 和 pyOpenSSL 是 pip 中最新的。

【问题讨论】:

  • 有什么很好的理由,你为什么使用python2.7?因为它不再受支持,你应该真正使用 python3
  • @UliSotschok 因为使用此 python 的应用程序不支持 python 3 并且可能永远不会...
  • py -m OpenSSL.debug 的输出是什么?您是否尝试过更新每个列出的模块?
  • 您想使用哪些模块 OpenSSL 1.1.1 但它们不是?
  • @CristiFati 我正在使用的应用程序使用 pyOpenSSL。如前所述,正确版本的验证是通过导入 ssl 然后打印 ssl.OPENSSL_VERSION_INFO 完成的。我应该看到 1.1.1 或更高版本

标签: python python-2.7 openssl windows-10 pyopenssl


【解决方案1】:

让 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 更加困难。这是因为依赖于微软msbuild 的构建系统不像*nix 上基于make 的构建系统那样容易调整。您可以在Python's PCbuild subdirectory 中查看关联的 Visual Studio 解决方案、项目和属性文件。

此外,OpenSSL 1.0.2 和 1.1.1 版本之间的差异在 Windows 上稍大一些,因为库名称也发生了变化,而在 *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 project。这用于从源代码构建 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 预构建库。
  • 修改了配置_ssl_hashlib 项目设置的openssl.props 属性文件,并对这些项目本身进行了一些更改。调整主要取自 Python 的v3.8.1 版本,以链接新的 OpenSSL 库并正确设置包含路径。通过此修改,OpenSSL 不再像以前在 2.7.17 中那样静态链接,而是动态链接。
  • 对文件Modules/posixmodule.cModules/timemodule.c 应用了类似于this patch 的补丁,以允许使用Visual Studio 2017 进行构建——与创建预构建OpenSSL 二进制文件的版本相同。

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

如果您对详细信息感兴趣,可以查看the associated commit in this fork of the cpython repo,我这样做只是为了澄清我的答案。它基于原始标签v2.7.17。如上所述,您应该能够通过检查该分支 v2.7.17_ossl_1.1.1 并在 PCbuild 中运行构建命令来重现构建。如果有足够多的人感兴趣,我可能会清理并保留它。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2019-06-13
    • 2016-08-05
    • 2011-06-20
    • 1970-01-01
    • 2018-11-25
    • 2019-03-14
    • 2011-07-04
    • 2012-06-13
    相关资源
    最近更新 更多