Python: неопределенный символ: TLSv1_method при импорте ssl - PullRequest
0 голосов
/ 06 апреля 2020

Я запускаю Python 3.5.6 в дистрибутиве, где версии TLS ниже 1.2 были скомпилированы из OpenSSL, передав эти параметры в ./configure: no-ssl no-tls1 no-tls1_1 no-ssl3-method no-tls1-method no-tls1_1-method. Версия OpenSSL - 1.1.1d. Python 3 собран из исходного кода во время сборки дистрибутива и связан с версией OpenSSL, включенной в дистрибутив.

Все собирается успешно, но когда я пытаюсь импортировать библиотеку ssl в Python, Я получаю следующую ошибку:

$ python3
Python 3.5.6 (default, Mar 23 2020, 05:11:33)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/ssl.py", line 99, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: /usr/lib/python3.5/lib-dynload/_ssl.cpython-35m-aarch64-linux-gnu.so: undefined symbol: TLSv1_method

Я не понимаю, почему эта ошибка возникает во время выполнения. Единственная ссылка, которую я могу найти в коде Python 3.5.6 на TLSv1_method, - это строка 3088 _ssl. c:

ctx = SSL_CTX_new(TLSv1_method());

Использование no-tls1-method компилирует реализацию TLSv1_method, и эта строка в коде Python не защищена никакими #ifdef. Но я ожидаю, что это вызовет сбой во время соединения для модуля _ssl.cpython-35m-aarch64-linux-gnu.so, а не во время выполнения, когда Python попытается импортировать модуль. Что здесь происходит, и есть ли способ исправить это без исправлений Python? Я не могу обновить используемую версию OpenSSL или Python.

1 Ответ

0 голосов
/ 08 апреля 2020

Кажется, что моя путаница возникла из-за неправильного понимания, как _ssl.cpython-35m-aarch64-linux-gnu.so ссылается на OpenSSL. Я предположил, что он был статически связан, но на самом деле он динамически связан с libssl.so. Вот почему ошибка возникает во время выполнения, когда загружается общий объект.

Таким образом, кажется, что единственный способ исправить это без обновления Python - это исправить вызов к TLSv1_method, чтобы использовать вместо этого generi c TLS_method. Я оставлю этот вопрос открытым в течение нескольких дней, хотя на тот случай, если у кого-нибудь есть более подходящее предложение.

Редактировать: я подал Python ошибку для этой проблемы. Это должно быть исправлено в будущем выпуске.

...