【问题标题】:PyCURL: TLS Handshake ErrorPyCURL:TLS 握手错误
【发布时间】:2023-04-25 23:23:01
【问题描述】:

我正在使用 PyCURL 测试我们提供的重定向服务 - 用户点击 http://xyz.com/asdf/ 并被重定向到 https://a.comhttps://b.comhttps://c.com

我正在尝试使用 PyCURL 请求 http://xyz.com,并打印出(但不是 HTTP 请求)字符串“https://{a|b|c}.com”,但只要目标 URL 是 HTTPS而不是 HTTP,PyCURL.request() 方法会引发以下异常:

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

谷歌搜索“pycurl tls 错误”并没有找到很多结果,除了一个提示 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')

提前致谢!

【问题讨论】:

    标签: python curl pycurl


    【解决方案1】:

    我刚刚解决了同样的问题。我不是 100% 确定出了什么问题。 但是我通过apt-get install python-pycurl 安装了pycurl,我认为默认情况下使用gnutls,但在我看来它应该是我系统上的openssl。

    我通过以下方式解决了这个问题:

    export PYCURL_SSL_LIBRARY=[openssl|gnutls|nss](选择 3 个中的一个,openssl、gnutls 或 nss,不带括号)

    pip install pycurl --upgrade

    如果您的pycurl版本已经是最新版本,请执行以下命令pip uninstall pycurl将其删除,然后运行上述命令。

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

    【讨论】:

      【解决方案2】:

      pycurl 使用 libcurl,并且可以构建 libcurl 以使用多个 TLS 库之一。 GnuTLS 和 OpenSSL 是其中的两个。因此,您可以重建 libcurl 以使用您喜欢的任何一个。

      【讨论】: