
Полагаю, я прав, предполагая (после некоторого гугления), что Python не использует установленную версию OpenSSL, а вместо этого использует свой собственный модуль SSL, и для его обновления его необходимо пересобрать.
Это на Raspberry Pi, небольшой образ без графического интерфейса на основе Raspbian Jessie. Я планирую полную пересборку на основе текущего дистрибутива позже, когда позволит время, а пока я хочу просто вручную обновить важные пакеты.
Я клонировал исходный код OpenSSL из git, извлек ветку 1.1.1-stable и собрал ее; только default configure
, make
, make test
и sudo make install
.
Теперь я пытаюсь пересобрать Python для использования этой версии.
Мне удалось заставить его работать с Python 3, но с Python 2 он не работает. Оба файла — это tar-архивы, загруженные сегодня с сайта www.python.org/downloads/source/, собранные с дополнительными опциями ./configure
и без них.make
Результат для 3.7.3: make выполнен успешно, как и этот тест
$ ./python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.1.1d-dev xx XXX xxxx
Старая (установленная) версия Python сообщает об OpenSSL 1.0.1t для python, а также для python3, поэтому новая сборка использует новую версию.
Результат для 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.