Назад | Перейти на главную страницу

Как изменить бэкэнд SSL libcurl с gnutls на openssl на сервере Ubuntu

Я получаю специфические ошибки gnutls на моем веб-сервере Tornado при обработке ответов Google OpenID SSL. Одно из предложений, которое я получил из списка рассылки Tornado, - попробовать бэкэнд OpenSSL вместо gnutls. Но на сервере Ubuntu (11.10) это не кажется простым.

На сервере Ubuntu gnutls предоставляется libcurl3-gnutls пакет и поддержка openssl curl обеспечивается libcurl4-openssl-dev пакет. (Я не знаю, почему последний назван 4 и dev, но я не смог найти другой пакет openssl + curl в поиске apt-cache).

я имел libcurl3-gnutls установлен по умолчанию, но не libcurl4-openssl-dev. Итак, я установил более поздние и перезапустил экземпляры Torando. Но, похоже, это не сработало. У меня все еще такие же ошибки gnutls.

Я нашел старые обсуждения в списках рассылки curl, посвященные проблемам поддержки различных бэкэндов SSL для libcurl, но не нашел, как именно это делается сегодня. Пока я предполагаю, что openssl встроен в libcurl, а gnutls предоставляется через отдельный пакет (это объясняет, почему нет libcurl3-openssl). Но как мне заставить libcurl подбирать бэкэнд openssl, а не gnutls? Есть ли в libcurl / pycurl API какой-либо вариант для этого?

Я пытался удалить libcurl3-gnutls, но apt-get запросил, что он также удалит python-pycurl вместе с ним. Так что этого не пойдет.

Я видел решение на Трекер ошибок Debian.

Я решил опубликовать обходной путь, чтобы люди могли исправить python-pycurl упаковать себя.

sudo apt-get install build-essential fakeroot dpkg-dev
mkdir ~/python-pycurl-openssl
cd ~/python-pycurl-openssl
sudo apt-get source python-pycurl
sudo apt-get build-dep python-pycurl
sudo apt-get install libcurl4-openssl-dev
dpkg-source -x pycurl_7.18.2-1.dsc
cd pycurl-7.18.2

Обратите внимание, что pycurl мог быть обновлен, поэтому имя может быть неточно pycurl_7.18.2-1.dsc Отредактируйте debian/control файл и замените все экземпляры libcurl4-gnutls-dev с участием libcurl4-openssl-dev

dpkg-buildpackage -rfakeroot -b
sudo dpkg -i ../python-pycurl_7.18.2-1_i386.deb

Для тестирования просто запрыгните на интерпретатор и посмотрите версию.

Раньше он говорил:

shell~# python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycurl
>>> pycurl.version
'libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8'

Теперь он скажет (если вы все сделали правильно):

shell~# python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycurl
>>> pycurl.version
'libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.8 libssh2/0.18'

Причина, по которой здесь работает простое редактирование файла debian / control, заключается в том, что оба libcurl4-gnutls-dev и libcurl4-openssl-dev использовать файл /usr/bin/curl-config для сборки своих пакетов. Один предназначен для сред gnutls, а другой - для openssl.

В -dev пакеты - это пакеты разработки, они содержат заголовки библиотек, используемые для разработки и компиляции программ, использующих библиотеку. Обычно они не требуются для двоичных пакетов приложений (которые уже скомпилированы). Установка libcurl4-openssl-dev недостаточно для создания бинарных пакетов, которые были созданы для libcurl3-gnutls вместо этого используйте OpenSSL. Это будет полезно только для приложений, которые вы повторно компилируете для этого.

В python-pycurl пакет имеет прямая зависимость на libcurl3-gnutls и libgnutls26.

Если для Ubuntu нет пакетов на основе cURL, скомпилированных с OpenSSL вместо GnuTLS в альтернативном репозитории, к сожалению, вам, возможно, придется создавать их самостоятельно.

В принципе это можно сделать, загрузив исходный код (apt-get source python-pycurlи сопутствующие пакеты). Вам нужно будет зайти в файлы конфигурации упаковки Debian и изменить параметры (обычно передаются в configure скрипт, который также настраивает Makefiles перед компиляцией), чтобы изменить параметры компиляции, чтобы вместо этого использовать OpenSSL. Вам также может потребоваться изменить описание пакета, чтобы ограничить прерывание работы других пакетов, возможно, используя provide: директива, чтобы сказать, что ваш пакет может заменить пакет, упакованный Ubuntu.

Удалите модуль pycurl и переустановите его с помощью pip.

sudo pip install pycurl

Насколько я понимаю, посылка libcurl3 должен предлагать поддержку OpenSSL.