Не удается подключиться к серверу aiohttp, работающему по HTTPS - PullRequest
0 голосов
/ 24 марта 2020

Справочная информация: я пишу веб-сервер, используя 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)

1 Ответ

1 голос
/ 24 марта 2020

Сервер SSL должен быть сконфигурирован для использования сертификата, соответствующего домену сервера, и соответствующего закрытого ключа, обычно с использованием load_cert_chain . Ваш сервер не настроен на использование сертификата и ключа сервера и, следовательно, не может предлагать какие-либо шифры, для которых это требуется, что означает, что он не может предлагать шифры, которые обычно ожидаются клиентом. Это означает, что нет общих шифров, следовательно, эта ошибка.

...