Как предотвратить прерывание из-за ошибки SSL - PullRequest
0 голосов
/ 01 августа 2020

У меня есть этот основной код, который на самом деле является веб-сервером http, который работает нормально, но завершение из-за ошибок SSL (пожалуйста, прокрутите вниз)

class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
    pass


def run():
    port =80
    if USE_HTTPS:
        port=443
    server = ThreadingSimpleServer(('0.0.0.0', port), PostHandler)
    if USE_HTTPS:
        import ssl
        server.socket = ssl.wrap_socket(server.socket, keyfile='./ssl/key.pem', certfile='./ssl/public.pem', server_side=True)
    server.serve_forever()

Ошибка

> File "/usr/lib/python3.6/socketserver.py", line 654, in
> process_request_thread
>     self.finish_request(request, client_address)   File "/usr/lib/python3.6/socketserver.py", line 364, in finish_request
>     self.RequestHandlerClass(request, client_address, self)   File "/usr/lib/python3.6/socketserver.py", line 724, in __init__
>     self.handle()   File "/usr/lib/python3.6/http/server.py", line 418, in handle
>     self.handle_one_request()   File "/usr/lib/python3.6/http/server.py", line 386, in handle_one_request
>     self.raw_requestline = self.rfile.readline(65537)   File "/usr/lib/python3.6/socket.py", line 586, in readinto
>     return self._sock.recv_into(b)   File "/usr/lib/python3.6/ssl.py", line 1012, in recv_into
>     return self.read(nbytes, buffer)   File "/usr/lib/python3.6/ssl.py", line 874, in read
>     return self._sslobj.read(len, buffer)   File "/usr/lib/python3.6/ssl.py", line 631, in read
>     v = self._sslobj.read(len, buffer) ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:2309)

Мне нужно две вещи:

  • Либо игнорировать любые ошибки сертификата SSL (пример: sslopt={"cert_reqs": ssl.CERT_NONE}, но он не работает при передаче через run_forever
  • Поймать эту ошибку SSL, реализовав run_forever чей пример кода я не могу найти.

При реализации многопоточного сервера HTTPS я обнаружил, что Python документации не хватает по сравнению с другими языками. Рабочие примеры найти сложно.

1 Ответ

0 голосов
/ 01 августа 2020

Либо игнорировать любые ошибки сертификата SSL (пример: sslopt={"cert_reqs": ssl.CERT_NONE}

Это предупреждение TLS, отправляемое клиентом, который не принимает сертификат сервера. Вы ничего не можете сделайте на стороне сервера, чтобы предотвратить эту ошибку, за исключением предоставления сертификата, который примет клиент. Это не связано с многопоточностью или Python, но касается исключительно сертификата, которому клиент не доверяет.

Поймайте эту ошибку SSL, реализуя run_forever ...

Согласно трассировке стека, ошибка выбрасывается внутри handle(), которую вы можете переопределить, чтобы поймать ошибку. См. здесь или здесь примеры того, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...