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。
让 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.1
Python的发布,以链接新的 OpenSSL 库并正确设置包含路径。通过此修改,OpenSSL 不再像以前在 2.7.17 中那样静态链接,而是动态链接。Modules/posixmodule.c
并Modules/timemodule.c
与此补丁类似,以允许使用 Visual Studio 2017 进行构建——与创建预构建 OpenSSL 二进制文件的版本相同。顺便说一下,在当前的构建过程中下载了比需要更多的东西,包括 OpenSSL 和 nasm 源代码。这只是为了尽可能少地修改原始构建脚本。
如果你对细节感兴趣,你可以在 cpython 存储库的这个分支中查看相关的提交,我这样做只是为了澄清我的答案。它基于原始标签v2.7.17
。如上所述,您应该能够通过检出该分支v2.7.17_ossl_1.1.1
并运行构建命令来重现构建PCbuild
。如果有足够多的人感兴趣,我可能会清理它并保留它。
归档时间: |
|
查看次数: |
6016 次 |
最近记录: |