PyCURL:TLS握手错误

1 投票
2 回答
3980 浏览
提问于 2025-04-15 17:16

我正在使用PyCURL来测试我们提供的一个重定向服务——用户访问 http://xyz.com/asdf/ 后会被重定向到 https://a.comhttps://b.comhttps://c.com

我想用PyCURL请求 http://xyz.com,并打印出字符串 "https://{a|b|c}.com",但每当目标网址是HTTPS而不是HTTP时,PyCURL.request() 方法就会抛出以下异常:

(35, 'gnutls_handshake() failed: A TLS fatal alert has been received.')

在网上搜索“pycurl tls error”没有找到很多结果,只有一个提示说Ubuntu上的PyCURL使用的是GnuTLS而不是OpenSSL。这会是导致我问题的原因吗?如果是的话,我该如何配置PyCURL使用OpenSSL呢?

我的操作系统是Ubuntu 9.10,Python版本是2.6,以下是我的PyCURL版本信息:

>>> pycurl.version_info()

(3, '7.19.5', 463621, 'x86_64-pc-linux-gnu', 1597, 'GnuTLS/2.8.3', 0, '1.2.3.3', ('tftp', 'ftp', 'telnet', 'dict', 'ldap', 'ldaps', 'http', 'file', 'https', 'ftps'), None, 0, '1.15')

谢谢大家的帮助!

2 个回答

1

pycurl是一个用来处理网络请求的工具,它依赖于一个叫libcurl的库。而libcurl可以根据需要使用不同的安全传输库,比如GnuTLS和OpenSSL这两种。也就是说,你可以重新编译libcurl,让它使用你喜欢的那个安全库。

2

我刚刚解决了同样的问题。虽然我不太确定具体哪里出错了,但我通过命令 apt-get install python-pycurl 安装了pycurl。我觉得这个命令默认使用的是gnutls,但在我的系统上,应该用openssl。

我解决这个问题的方法是:

export PYCURL_SSL_LIBRARY=[openssl|gnutls|nss] (从这三个选项中选择一个,openssl、gnutls或nss,记得去掉方括号)

pip install pycurl --upgrade

如果你的pycurl版本已经是最新的,可以通过执行命令 pip uninstall pycurl 来卸载它,然后再运行上面的命令。

来源: http://pycurl.sourceforge.net/doc/install.html

撰写回答