Python 2.7.16 可以用 openssl 1.1.1 构建吗?

Python 2.7.16 可以用 openssl 1.1.1 构建吗?

我想我正确地假设(经过一些谷歌搜索)Python 不使用已安装的 OpenSSL 版本,而是使用它自己的 ssl 模块,并且必须重建才能升级它。

这是 Raspberry Pi 上的基于 Raspbian Jessie 的小型非 GUI 映像。我计划在时间允许的情况下基于当前发行版进行全面重建,目前我只想手动升级重要的软件包。

我从 git 克隆了 OpenSSL 源代码,检出了 1.1.1-stable 分支并构建了它;仅默认的configuremake和。make testsudo make install

现在我正在尝试重建 Python 以使用该版本。

我让它在 Python 3 上运行,但是在 Python 2 中失败。两者都是今天从 www.python.org/downloads/source/ 下载的 tarball,使用./configuremake不使用任何附加选项构建。

3.7.3 的结果:make 成功,并且此测试也成功

$ ./python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.1.1d-dev  xx XXX xxxx

旧版(已安装)的 Python 报告 python 和 python3 的 OpenSSL 1.0.1t,因此新版本使用新版本。

2.7.16 的结果:make 仅部分成功,但最终以

Failed to build these modules:
_hashlib           _ssl               

同样的测试也进行

$ ./python -c "import ssl; print(ssl.OPENSSL_VERSION)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/src/python/Python-2.7.16/Lib/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: No module named _ssl

在构建这些模块时进行输出:

building '_ssl' extension
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -I/usr/include/arm-linux-gnueabihf -I/usr/local/include -I/usr/local/src/python/Python-2.7.16/Include -I/usr/local/src/python/Python-2.7.16 -c /usr/local/src/python/Python-2.7.16/Modules/_ssl.c -o build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_ssl.o -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-armv7l-2.7/_ssl.so
*** WARNING: renaming "_ssl" since importing it failed: build/lib.linux-armv7l-2.7/_ssl.so: undefined symbol: OPENSSL_sk_num
building '_hashlib' extension
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -I/usr/include/arm-linux-gnueabihf -I/usr/local/include -I/usr/local/src/python/Python-2.7.16/Include -I/usr/local/src/python/Python-2.7.16 -c /usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.c -o build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.o
gcc -pthread -shared build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.o -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-armv7l-2.7/_hashlib.so
*** WARNING: renaming "_hashlib" since importing it failed: build/lib.linux-armv7l-2.7/_hashlib.so: undefined symbol: OPENSSL_init_crypto

答案1

正如我在这个问题上的评论一样,答案是肯定的。

[编辑:一开始我以为是我的 CFLAGS,但不是。]

终于明白了。_ssl 模块的构建命令包含以下开关: -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib

这两个位置中的第一个仍包含旧版本 (1.0.0) 的 libssl.so。正确的版本位于第二个路径。

有趣的是,这在构建 3.7.3 时似乎没有什么区别,只有对于 2.7.16 才有区别。

相关内容