Неопределенный символ: OPENSSL_sk_num

Я пытаюсь обновить сертификат Let's Encrypt с помощью Certbot. Перестал работать, и я не знаю почему. Вот ошибка:

ImportError: /root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/
hazmat/bindings/_openssl.so: undefined symbol: OPENSSL_sk_num

У меня установлена ​​новейшая версия OpenSSL

OpenSSL 1.1.0d  26 Jan 2017

Я попытался отладить эту проблему, выполнив следующее. Сначала я просто попытался добавить импорт OpenSSL в консоли Python. Работало отлично, без ошибок. Но когда я пытаюсь

. ~/.local/share/letsencrypt/bin/activate

затем >>> import OpenSSlЯ получаю ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/rand.py", line 12, in <module>
    from OpenSSL._util import (
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/openssl/binding.py", line 14, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: /root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/_openssl.so: undefined symbol: OPENSSL_sk_num

Я попытался удалить путь /root/.local/share/letsencrypt/, а затем снова попытался запустить certbot-auto. Тем не менее я получаю ту же ошибку. Есть кто-нибудь, кто сталкивался с этой проблемой и знает решение? Пожалуйста, помогите мне здесь. Нужно обновить несколько сертификатов.

ОБНОВИТЬ:

Я нашел источник проблемы, что в /lib/x86_64-linux-gnu в каталоге есть старая версия libssl.so.1.0.0 и она не имеет OPENSSL_sk_num, Когда я пытаюсь заменить на более новую версию libssl1.1 (она имеет OPENSSL_sk_num) тогда я получаю ошибку, которая требует OPENSSL_VERSION 1.0.1, Затем после некоторой борьбы, удаляя библиотеки из /usr каталогов и локальных каталогов, я получаю ошибку ImportError: libssl.so.1.0.0: cannot open shared object file: No such file or directory, Как я могу изменить его, чтобы letsencrypt использовал более новую библиотеку?

РЕШЕНИЕ

После некоторой борьбы. Я только что переустановил openssl версии 1.1.0c. Скопировал библиотеку letsencrypt из другого проекта и все заработало. Я думаю, что некоторые обновления разрушили его. Поэтому я предлагаю всем, когда вы запускаете letsencrypt, просто используйте опцию --no-self-upgrade.

РЕШЕНИЕ ОБНОВЛЕНИЕ

Столкнувшись с этой проблемой еще раз, я решил решить ее правильным образом. В общем, вам нужно перекомпилировать openssl 1.1.0c с помощью команды:

./config -Wl,--enable-new-dtags,-rpath,'$(LIBRPATH)' а также make

Скопируйте скомпилированный libcrypto.so.1.1 а также libssl.so.1.1 в /usr/lib/x86_64-linux-gnu

Затем вам нужно повторить или просто изменить libcrypto а также libssl символьные ссылки. Будучи в /usr/lib/x86_64-linux-gnu папка введите команды ln -s libssl.so.1.1 libssl а также ln -s libcrypto.so.1.1 libcrypto,

Затем введите следующие команды:

cd ~/.local/share/letsencrypt/bin/
./pip uninstall cryptography pyopenssl -y
./pip install --upgrade pip
rm -rf ~/.cache/
./pip install cryptography pyopenssl

И все готово, все должно работать правильно.

3 ответа

Похоже, в версии 1.1.0f openssl символ OPENSSL_sk_num переехал в libcrypto.a, Сборка python 3, похоже, не связывает это, отсюда и отсутствующий символ. Однако я ошибся. Когда файл Modules/Setup.dist изменен, чтобы подобрать вашу собственную версию openssl, вам нужно скопировать ее в Modules/Setupиначе он будет использовать уже установленный ssl.

Я встретил эту ошибку при установке Python3.6.2 в Centos 7, он был установлен на openssl 1.0.1e, и я загружаю openssl 1.1.0.e. после следующих шагов это работает правильно.

cd ${openssl_src_path}

в моем случае ${openssl_src_path} равен '/usr/local/server/openssl-1.1.0e'

./configure --prefix=/usr/local --openssldir=/usr/local/openssl

make
make test
make install

после правильной установки OpenSSL установите Python3.6.2

cd ${python_src_path}/Modules

изменить файл "Setup", журнал изменений:

    SSL=/usr/local/openssl
_ssl _ssl.c \
    -DUSE_SSL -I/usr/local/openssl/include -I/usr/local/openssl/include/openssl \
    -L/usr/local/openssl/lib -lssl -lcryptoere

"SSL=/usr/local/openssl" - это значение параметра установки OpenSSL "--openssldir". И убедитесь, что каталог DUSE_SSL существует.

cd ${python_src_path}
./configure
make
make install

надеюсь, это поможет.

Я также имел undefined symbol: OPENSSL_sk_num ошибка после компиляции openssl сама. Я мог бы решить эту проблему, удалив каталог openssl в~/.local/share который был создан раньше и начинается заново. Это должно быть проблема с кэшированием и / или неправильным путем к библиотеке.

Другие вопросы по тегам