Ошибка бэкэнда SSL при использовании OpenSSL

87

Я пытался установить pycurl в virtualenv с помощью pip и получил эту ошибку

ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

Я прочитал некоторую документацию, в которой говорится, что «Чтобы исправить это, вам нужно указать setup.py, какой SSL-сервер используется» (источник), хотя я не уверен, как это сделать, поскольку я установил pycurl с помощью pip.

Как я могу указать бэкэнд SSL при установке pycurl с помощью pip?

Благодарность

helloworld2013
источник
1
Какая у вас ОС?
Евгений

Ответы:

121

Прочитав их файл INSTALLATION, я смог решить свою проблему, установив переменную среды и выполнив переустановку

  • удалить существующую pycurlустановку

    pip uninstall pycurl

  • экспортная переменная с вашим сервером SSL во время компоновки (это openssl выше)

    export PYCURL_SSL_LIBRARY=openssl

  • затем повторно установить pycurlс без кэша

    pip install pycurl --no-cache-dir

Там может быть другое решение, но оно отлично работает для меня при установке virtualenvи pipустановке.

helloworld2013
источник
2
Спасибо, PYCURL_SSL_LIBRARY=opensslработает отлично!
thnee
Для Mac OS X пользователей: не помнишь использовать set -x PYCURL_SSL_LIBRARY opensslвместо export PYCURL_SSL_LIBRARY=opensslесли вы используете рыбу консоли вместо Баша .
Serge
13
pip install pycurl --no-cache-dir
Shuguang Yang
Спасибо. Я просмотрел несколько возможных решений этой проблемы. Это решение сработало с первого раза.
Мэтт Сеттер
шаг за шагом пример установки virtualenv yippeecode.com/view-code/343QWQT144/…
helloworld2013
77

Ответ helloworld2013 правильный, но ключ соответствует библиотеке SSL, которую ожидает pycurl. Ошибка будет примерно такой:

pycurl: серверная часть ssl времени компоновки libcurl ( <библиотека> ) отличается от серверной части ssl времени компиляции ( <библиотека> или " none / other ")

Чтобы исправить это, вы должны использовать библиотеку, которую ожидает pycurl. В моем случае моя ошибка была « pycurl: libcurl link-time ssl backend ( nss ) is different from compile-time ssl backend (openssl) », поэтому мое исправление было:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl
DrStrangepork
источник
1
Блестяще. Это должно получить больше голосов. Первоначальный ответ относился к некоторым машинам. Это более общий способ исправить это в зависимости от вашей платформы.
Nishant
6
хм, это не сработало для меня на Mac. Похоже, PYCURL_SSL_LIBRARYчто полностью игнорируется. Для меня бэкэнд ssl во время компиляции всегда "(none / other)", хотя echo PYCURL_SSL_LIBRARYдает openssl.
Эдвард Ньюэлл
1
как @EdwardNewell, это исправление не сработало для меня в Scientific Linux (Rhel), хотя я указал nss для PYCURL_SSL_LIBRARY, серверная часть остается (none / other)
Yondaime008
3
На Mac я удалил pycurlи установил с флагами:pip install --global-option="--with-openssl" --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" pycurl
eigenein 03
2
Это сработало, но только со следующими параметрами: pip install pycurl --compile --no-cache-dirв CentOS 7.3.
Роберт Йи
51

С OSX 10.13, openSSL и virtualenv с установленным пивом мне удалось:

workon ..your-environment-here..
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include;pip install pycurl --compile --no-cache-dir
Майкл Уилсон
источник
4
Да, в MacOS 10.13.1 (High Sierra) это помогло! Большое спасибо! Чтобы переустановить openssl:brew reinstall openssl
Дени Арно
1
Я исправил свою проблему с этим. Спасибо :)
JeongjinKim 01
1
Исправлена ​​проблема в Mac OSX 10.13.4! Спасибо.
user1192748 05
1
Спасибо! Также исправлена ​​моя проблема. Mac OSX 10.13.4
Стивен Черч,
2
Дэрил жаль это слышать! У меня это снова сработало на Мохаве, поэтому я не уверен, в чем дело.
Майкл Уилсон
25

С помощью pip 7.1 вы можете поместить в свой файл требований следующее:

pycurl==7.19.5.1 --global-option="--with-nss"

Просто замените nss соответствующей серверной библиотекой ssl.

maharg101
источник
1
Это решение лучше, чем экспорт var и переустановка, потому что его можно использовать в файле requirements.txt, и его не нужно повторять для каждого пользователя.
dfarrell07 08
1
экспорт у меня не работал на CentOS 7. Но установка глобального параметра сработала. Благодарность!
Аарон Нгуен
Мне пришлось объединить ваше решение и решение @Michael Wilson, чтобы оно работало на macOS. Похоже на криптографическую проблему - некоторые обсуждения здесь: github.com/pyca/cryptography/issues/3489
kip2
20

Метод исправления pycurl после обновления Mac OS High Sierra:

  1. Переустановите библиотеки curl, чтобы использовать OpenSSL вместо SecureTransport

    brew install curl --with-openssl
    
  2. Установите pycurl с правильной средой и путями времени сборки

    export PYCURL_SSL_LIBRARY=openssl
    pip uninstall pycurl 
    pip install --no-cache-dir --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" --user pycurl
    
бледно
источник
2
Работал для меня на High Sierra (с использованием virtualenv).
djangoat 08
1
Да! Также смотрите эту статью cscheng.info/2018/01/26/…
somecallitblues
Работал для меня на High Sierra (с использованием virtualenv), но мне пришлось удалить флаг
--user
Большое спасибо!! Это было невероятно полезно. Запустив High Sierra и потратив на это пару часов, это единственное решение, которое сработало :)
Алессандро
Когда я использовал --userфлаг, как указано выше, я получил:Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
Дэрил Спитцер
19

Это сработало для меня:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

У меня ничего из этого не сработало (обратите внимание, что разница просто easy_install vs pip):

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl
#xor
curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz
#...
python setup.py --with-[nss|openssl|ssl|gnutls] install
ДжоэлБондюрант
источник
1
Этот easy_installвариант оказался единственным, что сработало. Я не понимаю, почему это так сложно. Мне было нужно export PYCURL_SSL_LIBRARY=openssl. Мой один сообщил "нет / другое" для скомпилированной библиотеки.
CMCDragonkai
Просто столкнулся с этой проблемой, и это решение было единственным, которое сработало для меня.
Boudewijn Aasman
2
По моему опыту, pip не удаляет полностью старую версию pucurl, которая была установлена ​​вместе с ОС (Centos7.2 в моем случае). Пип не трогал /usr/lib64/python2.7/site-packages/pycurl.so и файлы информации о яйцах из более ранней версии. Easy_install, с другой стороны, уничтожил их в дополнение к помещению яйца pycurl в пакеты сайтов.
sokhaty 02
Ух, попробовал все вышеперечисленное и не вышло. Это сработало для меня, когда мое исходное сообщение об ошибке было `` ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none / other) ''
Джеймс МакКормак,
10

У меня была эта проблема несколько дней. Наконец, с помощью других ответов здесь (в основном Александра Тяпкова) я заставил его работать для AWS Elastic Beanstalk.

Ручная установка (подключение по SSH):

sudo pip uninstall pycurl
curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss"

ВАЖНО: Обратите внимание, что вы должны убедиться, что используете правильную версию Python и PIP, иначе вы можете компилировать ее для Python 2.x и использовать v3.x.

Автоматическая установка в Elastic Beanstalk:

files:
  "/usr/local/share/pycurl-7.43.0.tar.gz" :
    mode: "000644"
    owner: root
    group: root
    source: https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz

commands:
  01_download_pip3:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'curl -O https://bootstrap.pypa.io/get-pip.py'
  02_install_pip3:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'python3 get-pip.py'
  03_pycurl_uninstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: '/usr/bin/yes | sudo pip uninstall pycurl'
  04_pycurl_download:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz'
  05_pycurl_reinstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss"'

container_commands:
  09_pycurl_reinstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    # the upgrade option is because it will run after PIP installs the requirements.txt file.
    # and it needs to be done with the virtual-env activated
    command: 'source /opt/python/run/venv/bin/activate && pip3 install /usr/local/share/pycurl-7.43.0.tar.gz --global-option="--with-nss" --upgrade'

У меня возникла эта проблема, потому что я пытался настроить Celery 4 с Django 1.10 в Elastic Beanstalk. Если это ваш случай, я написал об этом полный пост в блоге .

Диего Янчич
источник
тьфу спасибо. этот материал может раздражать, особенно потому, что файлы конфигурации eb кажутся очень непостоянными и никогда не выдают разумных ошибок (включая проблемы с форматированием)
Ян
Я поддержал этот ответ, поскольку он очень помог мне решить аналогичную проблему при установке pycurl на AWS: stackoverflow.com/questions/51019622/…
Грег Холст
8

Я использую CentOS 7. Я пробовал все вышеперечисленное, но ничего не заработало. Оказывается, мне нужно было запустить их как пользователь root. Поэтому, если у вас возникли проблемы, попробуйте любое из вышеперечисленных решений от имени пользователя root. В качестве примера вот что сработало у меня:

su -
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl

Конечно, применяются все обычные заявления об отказе от ответственности о работе от имени пользователя root.

Примечание. [Nss | openssl | ssl | gnutls] в приведенном выше коде означает выбор одного и не включает квадратные скобки или каналы. Человек, задавший исходный вопрос, выбрал бы openssl. В моем конкретном случае я выбрал nss. В сообщении об ошибке должно быть указано, какой выбор сделать.

Изменение 2019: выполнение sudo pip installможет вызвать проблемы с установкой Python в системе. Возможно, попробуйте поработать в виртуальной среде Python и установить там пакеты. Если это не сработает, трюк с sudo в моем ответе, вероятно, является одним из последних вариантов, которые следует рассмотреть.

альфонсо
источник
5

Вы можете скачать файл tar.gz здесь . Затем распакуйте его в папку. Там вы найдете файл setup.py. Выполните команду, указанную на сайте. Например:

python setup.py --with-[ssl|gnutls|nss] install

К вашему сведению: я пытался установить pycurl в свои окна, но не смог. Но сделал это на моем линуксе.

Сабудж Хассан
источник
спасибо за ответ, но это могло бы сработать для меня, только если бы я не выполнял установку через virtualenv и pip
helloworld2013
@Sabuj для установки pycurl в Windows используйте один из установщиков, представленных на этом отличном веб-сайте: lfd.uci.edu/~gohlke/pythonlibs/#pycurl
Adam
4

Я использую это на OS X, и некоторые из вышеперечисленных решений не работали. Подобный комментарий Эдварда НьюэллаPYCURL_SSL_LIBRARY переменная , казалось, были полностью проигнорированы.
Дальнейшее чтение установочного документа PycURL показало следующее:

pip может переустановить пакет, который он ранее скомпилировал, вместо перекомпиляции pycurl с новыми указанными параметрами

Поэтому мне пришлось заставить его скомпилировать:

pip install --compile pycurl

Это работает во многих случаях. Тем не менее, я столкнулся с несколькими системами, которые продолжали игнорировать переменную, поэтому, как и в ответе maharg101 , я прибег к параметрам установки, которые через pip можно установить следующим образом:

pip install pycurl --global-option="--with-[ssl|gnutls|nss]"

где вы выбираете один из трех вариантов внутри квадратных скобок. Обратите внимание, что доступная опция есть, sslа нет openssl . Если вы укажете, --with-opensslвы получите сообщение об ошибке. Также обратите внимание, что если вы возились с PYCURL_SSL_LIBRARYпеременной и переключили ее на забавные значения, чтобы увидеть, что произойдет, эта последняя команда обязательно поймает ее и выдаст ошибку, если значение установлено, но недействительно.

Гунга
источник
1
сначала удалите pycurl и сделайте это pip install pycurl --global-option="--with-nss"для меня. Для протокола, моя ошибкаImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (openssl)
ahyong
Спасибо @ahyong, у меня сработал трюк с глобальными параметрами, хотя я пытался установить его из tar, он работал с pip, но не с setup.py, странно ...
Yondaime008 07
4

Переустановка локона

Я пробовал все предложения из этого обсуждения, но ни один из них не помог мне. В качестве решения я переустановил curl и curlib. После этого я смог установить pycurl с поддержкой ssl внутри среды.

В начале:

'PycURL / 7.43.0 libcurl / 7.47.0 GnuTLS / 3.4.10 zlib / 1.2.8 libidn / 1.32 librtmp / 2.3'

Часть 1. Повтор / установка с помощью pip

Во-первых, я удалил pycurl из virtualenv с помощью pip, как было предложено в предыдущих ответах:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
pip install pycurl --global-option="--with-openssl"

Идея здесь в том, что пакет был кеширован, и мы просто повторно установили его с опцией openssl.

Я также попытался перекомпилировать pycurl с помощью pip, используя:

pip install pycurl --compile pycurl --no-cache

..но была такая же ошибка после запуска:

python
import pycurl
pycurl.version

ImportError: pycurl: libcurl бэкэнд SSL во время компоновки ( gnutls ) отличается от бэкэнд SSL во время компиляции ( openssl )

Часть 2. Установка из tar

После того, как предыдущий метод не сработал, я решил установить pycurl из tar с помощью:

curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
sudo tar -xzvf pycurl-7.43.0.tar.gz
cd pycurl-7.43.0/
sudo python setup.py --with-ssl install

Pycurl установлен глобально, но не в virtualenv. Я также не проверял, был ли он установлен с поддержкой SSL или нет, но думаю, что все еще без ssl.

Часть 3. Переустановка curl и curllib

Наконец я понял, что pycurl обычно не устанавливается в среду, потому что глобальные curl и libcurl скомпилированы с помощью gnutls.

Перед началом проверьте это с помощью:

curl-config --configure

Одна из выходных строк будет

'--without-ssl' --with-gnutls '

Чтобы перекомпилировать его:

Сначала удалите завиток:

sudo apt-get purge curl

Установите все зависимости сборки, необходимые для curl

sudo apt-get build-dep curl

Получить последнюю версию (по состоянию на 20 декабря 2016 г.) libcurl

mkdir ~/curl
wget http://curl.haxx.se/download/curl-7.51.0.tar.bz2
tar -xvjf curl-7.51.0.tar.bz2
cd curl-7.51.0

Обычные шаги для создания приложения из исходного кода

./configure
./make
 sudo make install

Если openssl установлен правильно, configure найдет его автоматически. Результат будет:

версия curl: 7.51.0
Настройка хоста: x86_64-pc-linux-gnu
Префикс установки: / usr / local
Компилятор: gcc
Поддержка SSL: включена (OpenSSL) ...

Устранение любых проблем с кешами расположения библиотек C-уровня («кеш общей библиотеки»)

sudo ldconfig

Теперь попробуйте переустановить pycurl в среде:

curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
pip install pycurl-7.43.0.tar.gz --global-option="--with-openssl"

Результат должен быть:

python
import pycurl
pycurl.version

'PycURL / 7.43.0 libcurl / 7.51.0 OpenSSL / 1.0.2g zlib / 1.2.8 librtmp / 2.3'

Александр Тяпков
источник
3

Для тех, у кого есть проблема внутри PyCharm CE на macOS Mojave, вот как я заставил его работать в venv:

  • укажите версию: 7.43.0.1
  • Параметры: --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl

Снимок экрана PyCharm Project Interpreter

сказка
источник
1
Для меня в macOS Mojave мне нужно было запустить brew, переустановить openssl, а затем pip install pycurl == 7.43.0.1 --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl
user495732 Why Me
2

Это сработало для меня:

pip install --compile --install-option = "- with-openssl" pycurl

user10148784
источник
2

Я пробовал все здесь на macOS 10.13 безуспешно. Затем я нашел https://gist.github.com/webinista/b4b6a4cf8f158431b2c5134630c2cbfe, который работал:

brew install curl --with-openssl
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include; pip install pycurl --compile --no-cache-dir

Это сработало для меня как без использования virtualenv, так и внутри virtualenv.

Дэрил Спитцер
источник
1

Не уверен, что это из-за работы в virtualenv, но на CentOS 7 эти решения у меня не работали; Скомпилированные объекты все еще захватывались из каталога кеша, когда я переустанавливал. Если вы столкнулись с той же проблемой после того, как попробовали другие решения здесь, попробуйте следующее:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir
Роберт Келли
источник
То же самое и здесь, в CentOS 7 он не работал, пока я не добавил эту --no-cahe-dirопцию. Просто хочу еще раз упомянуть, что ему удалось запустить только под root с помощью su -@alfonso. Делать sudo pip3 ...было недостаточно. Вероятно, необходимо для подбора переменной окружения.
Nagev
1

Ошибка:

ImportError: pycurl: libcurl бэкэнд ssl времени компоновки (openssl) отличается от бэкэнда ssl времени компиляции (нет / другое)

Это сработало для меня, Mac 10.13, python 3.5, импорт pycurl работал после такой установки

pip3 uninstall pycurl;

pip3 install --compile --install-option="--with-openssl" pycurl
ваирав
источник
У меня это сработало и на Python 2.7.10 на High Sierra.
Skyler
1

После долгого зацикливания на этом я обнаружил, что яблоко перестало включать заголовки OpenSSL с OS X 10.11 El Capitan. как исправить?

1) brew install openssl

2) echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile (or .zshrc for zsh, etc)

3) pip uninstall pycurl

4) pip install --install-option="--with-openssl" --install-option="--openssl-dir=/usr/local/opt/openssl" pycurl
Белый медведь
источник
Конечно, мне потребовалось много времени, чтобы заставить его работать, что, надо сказать, довольно раздражало. Радоваться, веселиться!!
Whitebear
1

Та же проблема на amazonlinux - решена. У
меня была эта проблема при создании образа докера на основе amazonlinux, установке python3.7 и добавлении модуля pycurl. Все остальные модули python были установлены правильно, кроме pycurl. Попробовав многие решения, предложенные в потоках, связанных с этой проблемой, я, наконец, решил свою проблему, используя следующие команды для установки всех частей.
yum -y install python3 python3-devel gcc libcurl-devel aws-cli openssl-static.x86_64
затем установил другие модули, такие как psycopg2-binary, requests, certifi, используя:
pip3 install --user --no-cache-dir -r requirements.txt

и, наконец, установил модуль pycurl, используя:

pip3 install --user --global-option="--with-openssl" --no-cache-dir pycurl
и передав сюда глобальную опцию openssl. Установка статической библиотеки openssl-static.x86_64 решила проблему в моем случае, поскольку использовала глобальную опцию, используемую второй командой pip3.

риметнак
источник
0

Для Python 2.7

sudo apt-get install build-essential libssl-dev libffi-dev python-dev

Для python 3.5 также установите следующее:

sudo apt-get install python3.5-dev

Загрузите последний исходный код pycurl-7.43.0.tar.gz (md5) с сайта pypi https://pypi.python.org/pypi/pycurl/7.43.0#downloads и выполните следующую команду:

python setup.py --with-openssl install

Также вы можете сделать это в среде Python:

(test_env)user@pc:~/Downloads/pycurl-7.43.0$ python setup.py --with-openssl install
Эндрю Нодерманн
источник
0
pip install -U pip

if [ "$(curl --version | grep NSS 2>/dev/null)" ]; then
    pip install --compile --install-option="--with-nss" pycurl
else
    pip install --compile --install-option="--with-openssl" pycurl
fi
Санкет Джагтап
источник
0

Я столкнулся с этой проблемой, и ответ Санкета Джагтапа сработал для меня. Я попробовал дать ответ, набравший наибольшее количество голосов, но он не сработал.

Моя старая версия openssl - 1.0.1t, я думаю, что переустановка openssl может решить эту проблему.

--- pycurl's openssl backend time....

Я восстановил последнюю версию openssl и попробовал этот ответ. Проверь это.

pip install --compile --install-option="--with-openssl" pycurl

Это сработало для меня.

Я рекомендую переустановить openssl, чтобы попробовать ..

F.allen
источник
0

Следующее сработало для меня с Python3.6

MacOS High-Sierra

sudo pip3 uninstall pycurl
sudo pip3 install --compile --install-option="--with-openssl" pycurl 

CentOS 7

sudo pip3 uninstall pycurl
sudo pip3 install --compile --install-option="--with-nss" pycurl
Самуэль
источник
0

FWIW, я столкнулся с множеством проблем, заставляя это работать через AWS Elastic Beanstalk, и, наконец, смог заставить его работать с:

packages:
  yum:
    openssl-devel: []
    libcurl-devel: []

container_commands:
  # Reinstall PyCurl with correct ssl backend
  05_reinstall_pycurl:
    command: |
      pip install --upgrade pip
      pip uninstall -y pycurl
      pip install --global-option='--with-openssl' pycurl
Шон Чон
источник
0

Недавно при обновлении проекта Django у меня была аналогичная ошибка. Но на этот раз установка переменной окружения не сработала. Поэтому мне пришлось установить обе переменные среды export PYCURL_SSL_LIBRARY=opensslи передать флаг --global-option="with-openssl".

Исходный ответ был размещен на этой странице

helloworld2013
источник
-1
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib

pip install pycurl --global-option="--with-openssl"
Евгений
источник