Python requests 提示 SSL 未知协议。

11

我正在尝试向我在AWS机器上设置的API发送请求。

我使用的代码如下:

import requests
import json

report_dict = {
        "client_name": "Wayne Enterprises",
        "client_id": 123,
        "report_type": "api_testing",
        "timestamp_generated": "2015-07-29T11:00:00Z",
        "report_data": {"revenue": 9000.00}
    }
report_json = json.dumps(report_dict)
resp = requests.post("https://my-url.com:8080/my-api/reports", data=report_json,verify=False)

这样做,我得到:

Traceback (most recent call last):
  File "art2_java_test.py", line 124, in <module>
    main()
  File "art2_java_test.py", line 9, in main
    test_post_good_data()
  File "art2_java_test.py", line 29, in test_post_good_data
    resp = requests.post("https://my-url.com:8080/my-api/reports", data=report_json,verify=Fal
se)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\api.py",
 line 109, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\api.py",
 line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\sessions
.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\sessions
.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\adapters
.py", line 428, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:5
90)

但当我将请求发送为http而不是https时,它通常可以正常工作。我发现一些证据表明这可能与代理服务器有关,但我没有使用代理服务器。除此之外,还有其他可能导致这个错误的原因吗?这是一个只能在我的公司本地网络上访问的网站,如果这一点相关,请告诉我。


很高兴你提到了代理,一提到它我就意识到我忘记它们了。问题已经解决了。 - Steven Edison
1
你需要安装requests[security]。在这里可以找到解决方案。 https://dev59.com/0pvga4cB1Zd3GeqP4Zqd#40307307 - Wolf7176
只是想再提供另一种可能性 - 我忘记在我的代理中添加协议,在set_proxy部分添加它作为"http://mypoxy:myport"修复了这个问题。 - SidJ
1个回答

19
.... https://my-url.com:8080/my-api/reports

...But when I send the request as http instead of https, it (usually) works fine.

我猜你可能在尝试使用同一个端口8080来处理http和https请求。但是,服务器通常只监听单个端口,要么是http要么是https,而不是两者都有。这意味着,如果你的客户端尝试在该端口上启动所需的https握手,则会收到一个普通的错误消息。然后客户端试图将此错误消息解释为TLS,并返回一些奇怪的错误消息,因为响应根本不是TLS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接