Я получаю специфические ошибки 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
скрипт, который также настраивает Makefile
s перед компиляцией), чтобы изменить параметры компиляции, чтобы вместо этого использовать OpenSSL. Вам также может потребоваться изменить описание пакета, чтобы ограничить прерывание работы других пакетов, возможно, используя provide:
директива, чтобы сказать, что ваш пакет может заменить пакет, упакованный Ubuntu.
Удалите модуль pycurl и переустановите его с помощью pip.
sudo pip install pycurl
Насколько я понимаю, посылка libcurl3
должен предлагать поддержку OpenSSL.