【问题标题】:Cannot connect to aiohttp server serving over HTTPS无法连接到通过 HTTPS 服务的 aiohttp 服务器
【发布时间】:2020-03-24 15:32:17
【问题描述】:

背景:我正在使用aiohttp/connect 的websocket 端点编写一个Web 服务器。该应用程序最初通过 HTTP 提供服务(客户端将连接到 ws://host/connect)。这在本地使用 localhost 工作,但是当我部署到 Heroku 时,该应用程序是通过 HTTPS 提供的,它不允许客户端连接到不安全的 websocket。因此,我尝试更改我的服务器,使其在本地使用 HTTPS。现在客户端甚至无法完成与服务器的 TLS 握手。这是我的设置:

server.py

from aiohttp import web
import ssl

app = web.Application()
app.router.add_get('/', handle)
app.router.add_get('/connect', wshandler)

ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_default_certs()

web.run_app(app, port=8443, ssl_context=ssl_context)
# web.run_app(app, port=8443)  # original 

当我运行服务器并尝试导航到 https://localhost:8443/(使用 Chrome 80)时,我得到以下回溯:

Traceback (most recent call last):
  File "/Users/peterwang/anaconda3/lib/python3.7/asyncio/sslproto.py", line 625, in _on_handshake_complete
    raise handshake_exc
  File "/Users/peterwang/anaconda3/lib/python3.7/asyncio/sslproto.py", line 189, in feed_ssldata
    self._sslobj.do_handshake()
  File "/Users/peterwang/anaconda3/lib/python3.7/ssl.py", line 763, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:1056)

我查看了ssl_context.get_ciphers(),发现它确实包含 Chrome 80 也与 TLS1.3 一起使用的密码套件。我还使用 Wireshark 来跟踪客户端和服务器之间的通信。我看到 TLS Client Hello,它说它可以处理 TLS1.0 到 TLS1.3,并且与许多与 ssl_context.get_ciphers() 重叠的密码兼容。服务器没有响应。

有人有什么建议吗? (我正在使用Python 3.7OpenSSL 1.1.1daiohttp 3.6.2

【问题讨论】:

    标签: python ssl tls1.2 aiohttp


    【解决方案1】:

    必须将 SSL 服务器配置为使用与服务器域和相关私钥匹配的证书,通常使用 load_cert_chain。您的服务器未配置为使用服务器证书和密钥,因此无法提供任何需要此功能的密码 - 这意味着它无法提供客户端通常期望的任何密码。这意味着没有共享密码,因此出现此错误。

    【讨论】:

    • 生成有效证书的最佳方法是什么?我使用 openssl 在本地生成的证书出现无效证书错误
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多