在处理Google OpenID SSL响应时,我在我的Tornadonetworking服务器中收到了gnutls特定的错误。 我从Tornado邮件列表得到的build议之一是尝试OpenSSL后端而不是gnutls。 但是Ubuntu服务器(11.10)似乎并不简单。
在Ubuntu服务器上, gnutls由libcurl3-gnutls包提供,openssl curl支持由libcurl4-openssl-dev包提供。 (我不知道为什么后者被命名为4和dev ,但是我在apt-cachesearch中找不到任何其他openssl + curl包)。
我默认安装了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 。 所以那不行
-dev包是开发包,它们包含库头,用于开发和编译使用库的程序。 通常不需要应用程序二进制包(已编译)。 安装libcurl4-openssl-dev不足以使已针对libcurl3-gnutls构build的二进制包改为使用OpenSSL。 它只会对你重新编译的应用程序有用。
python-pycurl包与libcurl3-gnutls和libgnutls26 直接相关 。
除非在替代版本库中有针对Ubuntu的基于cURL的软件包,而不是基于OpenSSL编译而不是GnuTLS,否则您可能不得不自己编译它们。
原则上这可以通过下载源代码( apt-get source python-pycurl和相关的包)来实现。 你将不得不进入Debian的打包configuration文件,并改变选项(通常传递给configure脚本,这个configure脚本在编译之前也会configurationMakefile ),以改变编译选项,改用OpenSSL。 您可能还需要更改软件包描述以限制其他软件包的中断,也许可以通过使用provide:指令来说明您的软件包可以replace由Ubuntu打包的软件包。
我在Debian bug跟踪器上看到了一个解决scheme。
我想我会发布一个解决scheme的人来修复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-openssl-devreplacelibcurl4-gnutls-dev所有实例
dpkg-buildpackage -rfakeroot -b sudo dpkg -i ../python-pycurl_7.18.2-1_i386.deb
要testing只是在解释器上跳转,看看版本。
它曾经说过:
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来构build它的包。 一个是gnutls环境,另一个是openssl。
据我所知,包libcurl3应该提供OpenSSL支持。
取出pycurl模块并用pip重新安装。
sudo pip install pycurl