【问题标题】:Flask webservice https call results in ssl errorFlask webservice https调用导致ssl错误
【发布时间】:2020-02-19 07:13:43
【问题描述】:

我有提供 REST 接口的基于 Flask 的网络服务。

我们编写了继承自 flask.Flask 的 webservice 类,无法在此处提供完整的代码,但 webservice 应用调用看起来像, app.run(host=host, port=port, ssl_context='adhoc)

当我尝试运行 GET 请求时,我收到 SSL 错误,

  File "/opt/debesys/build/x86-64/debug/python/tt/pyrate/test/test_juno_sim.py", line 1077, in test_main_page
    resp = requests.get(self.url, headers=self.headers, verify=False)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
    r = adapter.send(request, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/adapters.py", line 382, in send
    raise SSLError(e, request=request)
SSLError: [Errno 1] _ssl.c:507: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

我也尝试过启动应用程序,例如, app.run(host=host, port=port, ssl_context=('cert.pem', 'key.pem')) 还使用urllib2 模块而不是requests 模块来获取请求。

但得到同样的错误。如果我尝试在没有ssl_context 的情况下启动应用程序并使用http 则成功获得响应。

这里我使用headers = {'Content-Type': 'application/json'}url = "https://127.0.0.1:{}".format(port)

[shrishinde@localhost debesys]$ wget https://127.0.0.1:47855/
--2020-02-19 13:03:25--  https://127.0.0.1:47855/
Connecting to 127.0.0.1:47855... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.
[shrishinde@localhost debesys]$ wget http://127.0.0.1:47855/
--2020-02-19 13:03:28--  http://127.0.0.1:47855/
Connecting to 127.0.0.1:47855... connected.
HTTP request sent, awaiting response... 200 OK
Length: 31 [text/html]
Saving to: “index.html”

100%[=====================================================================================================================================================================>] 31          --.-K/s   in 0s      

2020-02-19 13:03:28 (6.25 MB/s) - “index.html” saved [31/31]

[shrishinde@localhost debesys]$

更新

找到解决方案: 继承 Flask 后,我们重写了 Flask run 方法,并且使用了 WSGIServer,所以我应该使用 ssl_args 而不是 ssl_context

希望上述步骤能帮助用户诊断类似问题,因此请保留问题。

【问题讨论】:

    标签: python-2.7 ssl flask python-requests


    【解决方案1】:

    我可能知道发生了什么,即使您应该在堆栈跟踪旁边提供部分代码以更好地理解问题。

    SSL 例程:SSL23_GET_SERVER_HELLO:未知协议

    当 OpenSSL 从服务器接收到错误的握手参数时,会产生此错误。如果服务器使用纯 HTTP(没有 TLS)进行响应,则可能会发生这种情况。它可能由于其他各种原因而发生,您的客户端可能不理解 TLS 版本(库仅支持 SSL)或类似的东西。

    尝试使用wgetPostman对url (http://your.url:422)运行请求。如果您收到响应,则 SSL 未启用。

    已修复

    好的,我已经设法复制了您的问题,您没有在 ssl 模式下运行服务器。运行这个。

    pip install pyopenssl

    python -m flask run --cert=adhoc

    并确保消息在 https://127.0.0.1:5000/ 上运行,然后退出并运行它

    python -m flask run --cert=adhoc -p [你的端口]

    在你想要的端口运行 int

    【讨论】:

    • 你的猜测是正确的。 wget 与 http 是成功的。您能否提出解决方案?
    • 好吧,不知道你是开发模式还是生产模式。如果您正在开发中,请尝试blog.miguelgrinberg.com/post/…,否则您可能需要在您的 Apache/Nginx 或其他 Web 服务器中启用它。
    • 请告诉我这是否是将其包含在主要响应中的正确解决方案。
    • 我处于开发模式并引用了同一个博客,这就是为什么在 ssl_context 中也尝试使用 pem 文件
    • 哦,对不起,我忘记了那部分,让我检查一下。
    【解决方案2】:

    没有代码只能猜测。

    由于错误状态为unknown protocol,您可能需要检查您是否调用了正确的协议,例如。没有调用HTTPS 而不是HTTP,这是在本地环境中开发时的常见错误。

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 2016-02-18
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多