在处理 Google OpenID SSL 响应时,我的 Tornado 网络服务器中出现了 gnutls 特定错误。我从 Tornado 邮件列表中收到的建议之一是尝试使用 OpenSSL 后端而不是 gnutls。但在 Ubuntu 服务器 (11.10) 上似乎不太容易。
在 Ubuntu 服务器上,gnutls
由软件包提供libcurl3-gnutls
,而 openssl curl 支持由软件包提供libcurl4-openssl-dev
。(我不知道为什么后者被命名为4
和dev
,但我在 apt-cache 搜索中找不到任何其他 openssl+curl 包)。
我已经libcurl3-gnutls
默认安装了,但没有libcurl4-openssl-dev
。所以我安装了后者并重新启动了 Torando 实例。但这似乎不起作用。我仍然收到相同的 gnutls 错误。
我在 curl 邮件列表中找到了关于支持 libcurl 的不同 SSL 后端的问题的旧讨论,但没有找到现在具体是如何实现的。到目前为止,我猜想 openssl 是内置在 libcurl 中的,而 gnutls 是通过单独的包提供的(这将解释为什么没有 libcurl3-openssl)。但我如何让 libcurl 选择 openssl 后端而不是 gnutls?libcurl/pycurl API 中是否有一些选项可以做到这一点?
我尝试卸载libcurl3-gnutls
,但 apt-get 提示它也会python-pycurl
一起删除。所以这不行。
答案1
这些-dev
包是开发包,它们包含库头文件,用于开发和编译使用该库的程序。它们通常不是应用程序二进制包(已编译)所必需的。安装libcurl4-openssl-dev
不足以使已构建的二进制包改用libcurl3-gnutls
OpenSSL。它只对您重新编译的应用程序有用。
该python-pycurl
包有一个直接依赖上libcurl3-gnutls
和libgnutls26
。
除非在其他存储库中有针对 OpenSSL 而不是 GnuTLS 编译的基于 cURL 的 Ubuntu 软件包,否则您可能不得不自己构建它们。
原则上,这可以通过下载源代码( 和相关软件包)来实现apt-get source python-pycurl
。您必须进入 Debian 打包配置文件并更改选项(通常传递给在编译前configure
配置Makefile
s 的脚本),以便更改编译选项,改用 OpenSSL。您可能还需要更改软件包描述以限制对其他软件包的干扰,也许可以使用指令来provide:
说明您的软件包可以替换 Ubuntu 打包的软件包。
答案2
我在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。
答案3
删除 pycurl 模块并使用 pip 重新安装。
sudo pip install pycurl
答案4
据我了解,该软件包libcurl3
应该提供 OpenSSL 支持。