问题描述
在处理Google OpenID SSL响应时,我的Tornado网络服务器中出现了gnutls特定错误。我从龙卷风邮件列表中得到的建议之一是尝试使用OpenSSL后端而不是gnutls。但这在Ubuntu服务器(11.10)上似乎并不简单。
在Ubuntu服务器上,libcurl3-gnutls
软件包提供gnutls
,而libcurl4-openssl-dev
软件包提供openssl curl支持。 (我不知道为什么后来将其命名为4
和dev
,但在apt-cache搜索中找不到任何其他openssl + curl软件包)。
我默认安装了libcurl3-gnutls
,但没有安装libcurl4-openssl-dev
。因此,我安装了更高版本并重新启动了Torando实例。但这似乎没有用。我仍然遇到同样的错误。
我在curl邮件列表上发现了有关将不同的SSL后端支持到libcurl的问题的旧讨论,但是今天却找不到确切的做法。到目前为止,我的猜测是openssl内置在libcurl中,而gnutls是通过单独的包提供的(这将解释为什么没有libcurl3-openssl)。但是,如何使libcurl接上openssl后端而不是gnutls? libcurl /pycurl API中是否有某些选项可以做到这一点?
我尝试卸载libcurl3-gnutls
,但apt-get提示它也将同时删除python-pycurl
。所以那不会。
最佳办法
-dev
软件包是开发软件包,它们包含库标头,用于开发和编译使用该库的程序。应用程序二进制软件包(已编译)通常不需要它们。仅安装libcurl4-openssl-dev
不足以使针对libcurl3-gnutls
构建的二进制程序包改用OpenSSL。它仅对re-compile反对的应用程序有用。
python-pycurl
封装在libcurl3-gnutls
和libgnutls26
上具有direct dependency。
除非在替代存储库中有针对OpenSSL而不是针对GnuTLS编译的基于Ubuntu的基于cURL的软件包,否则您可能不得不自己构建它们。
原则上,这可以通过下载源代码(apt-get source python-pycurl
和相关软件包)来完成。您必须进入Debian打包配置文件并更改选项(通常在编译之前传递给configure
脚本,该脚本还配置Makefile
)以更改编译选项,而改为使用OpenSSL。您可能还需要更改软件包说明以将破坏范围限制在其他软件包中,也许是通过使用provide:
指令来说明您的软件包可以替换Ubuntu所打包的软件包。
次佳办法
我在Debian bug tracker上看到了一个解决方案。
我想我会发布一种解决方法,让人们自己修复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
来构建其软件包。一种是针对nutl的环境,另一种是针对openssl的。