龙卷风HTTPClient的SSL错误

时间:2013-08-15 14:14:17

标签: python ssl tornado

我正在尝试使用tornado的http客户端来获取URL。我以前做了很多次,但这次我得到了一个非常奇怪的SSL错误。我正在尝试使用的端点没有有效的证书,但是在curl调用上的-k仍然证明它有效。

$ curl https://myhostname.com:9001
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

$ curl https://myhostname.com:9001 -k
404 page not found

我在网上找到的所有答案都建议将validate_cert设置为False(我已经在做了)。但是当我尝试做我认为龙卷风的httpclient(validate_cert = False)中的等价物时,我仍然会得到一个非常奇怪的错误。这是一段破解的测试代码:

import tornado.httpclient

request = tornado.httpclient.HTTPRequest(
    url="https://myhostname.com:9001",
    method="GET",
    validate_cert=False
)
print tornado.httpclient.HTTPClient().fetch(request)

结果如下:

WARNING:tornado.general:SSL Error on 6 ('myhostname.com', 9001): [Errno 1] _ssl.c:499: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
Traceback (most recent call last):
  File "./test.py", line 17, in <module>
    make_call()
  File "/Users/kaleb.pomeroy/workspace/lefty/dashboard/lib/python2.7/site-packages/tornado-3.1-py2.7.egg/tornado/gen.py", line 140, in wrapper
    result = func(*args, **kwargs)
  File "./test.py", line 13, in make_call
    response = tornado.httpclient.HTTPClient().fetch(request)
  File "/Users/kaleb.pomeroy/workspace/lefty/dashboard/lib/python2.7/site-packages/tornado-3.1-py2.7.egg/tornado/httpclient.py", line 85, in fetch
    self._async_client.fetch, request, **kwargs))
  File "/Users/kaleb.pomeroy/workspace/lefty/dashboard/lib/python2.7/site-packages/tornado-3.1-py2.7.egg/tornado/ioloop.py", line 370, in run_sync
    return future_cell[0].result()
  File "/Users/kaleb.pomeroy/workspace/lefty/dashboard/lib/python2.7/site-packages/tornado-3.1-py2.7.egg/tornado/concurrent.py", line 65, in result
    raise self._exception
tornado.httpclient.HTTPError: HTTP 599: [Errno 1] _ssl.c:499: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

不幸的是我的端点不公开,所以我无法提供我用来生成此错误的确切代码。

有没有人看过这个错误,或者有解决方案?

由于

1 个答案:

答案 0 :(得分:1)

这看起来可能与https://github.com/facebook/tornado/blob/fd4d8997a772829b8439322dbce45091bc51beaf/tornado/simple_httpclient.py#L196的逻辑有关 这是tornado.simple_httpclient在连接到Python 2.6上的某些服务器时遇到问题的已知问题,这看起来像是相同的错误消息,但我之前没有在Python 2.7上看到过这种失败。

尝试将ssl_options={"ssl_version": ssl.PROTOCOL_TLSv1}传递给HTTP请求。您还可以尝试tornado.curl_httpclient进行替代实施,这种实施更有可能处理不太常见的服务器配置。