背景:我正在使用aiohttp
编写一个web服务器,websocket端点位于/connect
。该应用程序最初是通过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()
,发现它确实包含了Chrome80在TLS1.3中使用的密码套件。我还使用Wireshark跟踪客户端和服务器之间的通信。我看到TLS客户机Hello,它表示它处理TLS1.0到TLS1.3,并且与许多与^{
有人有什么建议吗?(我正在使用Python 3.7
、OpenSSL 1.1.1d
和aiohttp 3.6.2
)
SSL服务器必须配置为使用与服务器域和相关私钥匹配的证书,通常使用load_cert_chain。您的服务器未配置为使用服务器证书和密钥,因此无法提供任何需要该证书和密钥的密码-这意味着它无法提供客户端通常期望的任何密码。这意味着没有共享密码,因此出现此错误
相关问题 更多 >
编程相关推荐