我想我正确地假设(经过一些谷歌搜索)Python 不使用已安装的 OpenSSL 版本,而是使用它自己的 ssl 模块,并且必须重建才能升级它。
这是 Raspberry Pi 上的基于 Raspbian Jessie 的小型非 GUI 映像。我计划在时间允许的情况下基于当前发行版进行全面重建,目前我只想手动升级重要的软件包。
我从 git 克隆了 OpenSSL 源代码,检出了 1.1.1-stable 分支并构建了它;仅默认的configure
、make
和。make test
sudo make install
现在我正在尝试重建 Python 以使用该版本。
我让它在 Python 3 上运行,但是在 Python 2 中失败。两者都是今天从 www.python.org/downloads/source/ 下载的 tarball,使用./configure
和make
不使用任何附加选项构建。
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 才有区别。