python - 如何为 python 2.7 安装 openssl 1.1.1?

标签 python python-2.7 openssl windows-10 pyopenssl

我在 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 和密码学的最新点子。

我安装的 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。

最佳答案

让 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 , 不像 make 那样容易调整基于 *nix 的构建系统。您可以在 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 中才能工作。之后,以下内容重现了您的测试,显示了 OpenSSL 1.1.1d 与 Python 2.7.17 的使用:
> 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 预构建库的批处理脚本。
  • 修改了 openssl.props 配置多个 _ssl 的属性文件和 _hashlib 项目设置,并对这些项目本身进行了一些更改。调整主要来自 v3.8.1发布 Python,以链接新的 OpenSSL 库并正确设置包含路径。通过此修改,OpenSSL 不再像以前在 2.7.17 中那样静态链接,而是动态链接。
  • 对文件应用补丁 Modules/posixmodule.c Modules/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 中运行构建命令正如刚才提到的。如果有足够多的人感兴趣,我可能会清理它并保留它。

    关于python - 如何为 python 2.7 安装 openssl 1.1.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60213767/

    相关文章:

    python - 在 Python 中查找偶数

    Python - 将格式化行导入为索引列表对象

    objective-c - 用 Common Crypto 替换 OpenSSL 依赖? (Mac App Store 收据验证)

    encryption - OpenSSL:不再支持 -pbkdf2 选项?

    php - openssl_pkey_new() 抛出错误——为 php 正确设置 openssl.cnf

    .py 文件中的 Python 手册 EOF

    python - Python ntplib 响应中的所有字段是什么,它们是如何使用的?

    python - 如何在事件回调之间保持 python 生成器的状态

    python - 导入错误 : No module named stack

    mysql - 检查目标 DBMS 连接期间出错