Помилка бекенда 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, який SSD використовується" (джерело), хоча я не знаю, як це зробити, оскільки я встановив pycurl за допомогою pip.

Як я можу вказати бекенд SSL при встановленні pycurl за допомогою pip?

Дякую


1
Яка ваша ОС?
Євгеній

Відповіді:


121

Прочитавши файл ВСТАНОВЛЕННЯ, я зміг вирішити свою проблему, встановивши змінну середовища та зробив перевстановлення

  • видалити існуючу pycurlустановку

    pip uninstall pycurl

  • експортувати змінну зі своїм серверним інтерфейсом SSL для часу на зв’язок (що відкрито вище, див.

    export PYCURL_SSL_LIBRARY=openssl

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

    pip install pycurl --no-cache-dir

Там може бути інше рішення, але це ідеально підходить для мене щодо встановлення virtualenvта pipвстановлення.


2
Дякую, PYCURL_SSL_LIBRARY=opensslчудово працює!
thnee

Для користувачів mac os x : не пам’ятайте використання set -x PYCURL_SSL_LIBRARY opensslзамість того, export PYCURL_SSL_LIBRARY=opensslякщо ви використовуєте fish console замість bash .
Серж

13
pip install pycurl --no-cache-dir
Shuguang Yang

Дякую. Я розглянув низку можливих рішень цього питання. Це рішення спрацювало вперше.
Метт Сеттер,

покроковий приклад встановлення virtualenv yippeecode.com/view-code/343QWQT144/…
helloworld2013,

77

Відповідь helloworld2013 правильна, але ключ відповідає бібліотеці SSL, яку очікує pycurl. Помилка буде приблизно такою:

pycurl: libcurl-час з'єднання ssl-сервер ( <бібліотека> ) відрізняється від сервера-інтерфейсу часу компіляції ( <бібліотека> або " немає / інше ")

Щоб виправити це, вам слід скористатися бібліотекою, яку очікує pycurl. У моєму випадку моєю помилкою було " pycurl: libcurl link-time ssl backend ( nss ) відрізняється від часу компіляції ssl backend (openssl) ", тому моє виправлення було:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl

1
Блискуче. Це має набрати більше голосів. Оригінальна відповідь стосувалася деяких машин. Це більш загальний спосіб виправити це залежно від вашої платформи.
Нішант

6
хм, це не спрацювало у мене на Mac. Здається PYCURL_SSL_LIBRARY, на нього повністю ігнорують. Бекенд ssl під час компіляції завжди для мене "(none / other)", хоча і echo PYCURL_SSL_LIBRARYдає openssl.
Едвард Ньюелл

1
як @EdwardNewell, це виправлення не працювало для мене в Scientific Linux (Rhel), хоча я вказав nss для PYCURL_SSL_LIBRARY, сервер залишається (жоден / інший)
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

2
Це спрацювало, але лише з наступними опціями: pip install pycurl --compile --no-cache-dirна CentOS 7.3.
Robert Yi

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

1
Виправлено проблему на Mac OSX 10.13.4! Дякую.
user1192748

1
Дякую! Також вирішив мою проблему. Mac OSX 10.13.4
Стівен Черч

2
Дарилу, шкода, що це почув! Це знову спрацювало для мене в Мохаве, тому я не впевнений, що там.
Майкл Вілсон,

25

За допомогою pip 7.1 ви можете додати наступне у файл своїх вимог:

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

Просто замініть nss на відповідну серверну бібліотеку ssl.


1
Це рішення краще, ніж експортувати var та перевстановити, оскільки до нього можна надати спільний доступ у файлі requirements.txt і не потрібно повторювати для кожного користувача.
dfarrell07,

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

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.
Daryl Spitzer

19

Це працювало для мене:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

Нічого з цього у мене не спрацювало (зауважте, різниця просто easy_install проти 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). Pip не торкався файлів /usr/lib64/python2.7/site-packages/pycurl.so та яєчної інформації з попередньої версії. Easy_install, з іншого боку, видалив їх на додаток до розміщення яєць пікурлу в пакунках сайту.
сохати

Тьфу, спробував усе вищесказане, і це не спрацювало. Це спрацювало для мене, коли моє початкове повідомлення про помилку було `` ImportError: pycurl: libcurl link-time ssl backend (openssl) відрізняється від сервера компіляції 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. Як приклад, ось що мені вдалося:

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

Звичайно, застосовуються всі звичайні застереження щодо роботи від імені користувача root.

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

2019 Edit: Виконання sudo pip installможе спричинити проблему із системною установкою Python на машині. Можливо, спробуйте працювати у віртуальному середовищі Python і встановити там пакети. Якщо це не спрацює, трюк судо в моїй відповіді, мабуть, один з останніх варіантів, який слід розглянути.


5

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

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

FYI: Я намагався встановити pycurl у свої вікна, але не зміг. Але зробив це на моєму Linux.


дякую за відповідь, але це може спрацювати для мене лише в тому випадку, якщо я не виконую установку за допомогою virtualenv та pip
helloworld2013

@Sabuj для встановлення pycurl в Windows використовуйте один із програм встановлення, розміщений на цьому чудовому веб-сайті: lfd.uci.edu/~gohlke/pythonlibs/#pycurl
Адам,

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

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.Re/Установка за допомогою 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 time-time ssl backend ( gnutls ) відрізняється від back-ssl backend часу компіляції ( openssl )

Частина 2. Установка із смоли

Після того, як попередній метод не працював, я вирішив встановити 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. Повторне встановлення кучеря та кучеря

Нарешті, я зрозумів, що pycurl не встановлюється нормально в середовище, оскільки глобальний curl та libcurl компілюються за допомогою горіхів.

Перед початком перевірте:

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
Compiler: 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


1
Для мене в macOS Mojave мені потрібно було запустити заново перевстановити openssl, а потім встановити pip pycurl == 7.43.0.1 --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl
user495732 Чому я


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 ...було недостатньо добре. Можливо, це необхідно для того, щоб змінна середовища була підхоплена.
Нагев

1

Помилка:

ImportError: pycurl: libcurl time-time ssl backend (openssl) відрізняється від ssl-сервера bac-time (none / other)

Це працювало у мене, 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

Затримавшись на цьому довгий час, я дізнався, що Apple перестав включати заголовки 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, request, 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

Я зіткнувся з цією проблемою, і відповідь Sanket Jagtap мені допомогла . Я спробував відповідь із найбільшою кількістю голосів, але це не спрацювало.

Моя стара версія openssl - 1.0.1t, я думаю, що перевстановлення openssl може вирішити цю проблему.

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

Я відновив останню версію openssl і спробував цю відповідь. Перевір це.

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

Це спрацювало для мене.

я рекомендую нам перевстановити наш openssl для спроби ..


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".

Оригінальна відповідь була розміщена на цій сторінці


-1
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib

pip install pycurl --global-option="--with-openssl"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.