Как обрабатывать https клиенты с сокетами в python? Создание прокси-сервера - PullRequest
1 голос
/ 14 апреля 2020

Я создаю прокси-сервер, используя сокеты в python. Я знаю, как обращаться с клиентами http. Но с https это не работает. Я отправляю клиенту сообщение, что все в порядке. Затем я пытаюсь обернуть клиентский сокет как безопасный сокет. Но это не работает.

Я получил сообщение:

Exception in thread Thread-14:
Traceback (most recent call last):
  File "C:\Python37\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
  File "C:\Python37\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:/Users/Даниил/Downloads/python/proxy_server/proxy_server.py", line 39, in __handle_client
    self.__handle_https(client_sock, client_data, host, port)
  File "C:/Users/Даниил/Downloads/python/proxy_server/proxy_server.py", line 62, in __handle_https
    server_side=True)
  File "C:\Python37\lib\ssl.py", line 1238, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs
  File "C:\Python37\lib\ssl.py", line 423, in wrap_socket
    session=session
  File "C:\Python37\lib\ssl.py", line 870, in _create
    self.do_handshake()
  File "C:\Python37\lib\ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1076)

У меня есть сертификат с общим именем: localhost, и я добавил его в браузер. Даже когда я создаю сертификат с общим именем хоста (например, docs. python .org) и добавляю его в браузер, он не работает.

Вот мой код обработки запросов https:

   def __handle_https(self, client_sock, data, host, port):
        client_sock.sendall(b'HTTP/1.1 200 Connection Established\r\n\r\n')

        sclient = ssl.wrap_socket(client_sock,
                                  certfile='server.crt',
                                  keyfile='server.key',
                                  server_side=True)

1 Ответ

0 голосов
/ 14 апреля 2020

HTTP-прокси должен пересылать данные между клиентом и сервером только после выполнения запроса CONNECT. Он не должен обрабатывать сам TLS, как вы пытаетесь. Вместо этого он должен пересылать данные без изменений, чтобы между клиентом и сервером существовало сквозное соединение TLS через прокси.

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