Справочная информация: я пишу веб-сервер, используя aiohttp
с конечной точкой веб-сокета в /connect
. Изначально приложение обслуживалось по протоколу HTTP (и клиенты подключались к ws://host/connect
). Это работало локально, используя localhost
, но когда я развернул в Heroku, приложение обслуживалось по HTTPS и не позволяло клиентам подключаться к небезопасной веб-розетке. Поэтому я попытался изменить свой сервер, чтобы он использовал 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 для отслеживания связи между клиентом и моим сервером. Я вижу Hello-клиент TLS, который говорит, что он обрабатывает TLS1.0 через TLS1.3 и совместим с множеством шифров, которые перекрываются с ssl_context.get_ciphers()
. Нет ответа от сервера.
У кого-нибудь есть совет? (Я использую Python 3.7
, OpenSSL 1.1.1d
и aiohttp 3.6.2
)