如何在python中使用套接字处理https客户端?制作代理服务器

如何在python中使用套接字处理https客户端?制作代理服务器,python,sockets,https,proxy,Python,Sockets,Https,Proxy,我正在用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

我正在用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)

HTTP代理只应在完成连接请求后在客户端和服务器之间转发数据。它不应该在您尝试时处理TLS本身。相反,它应该原封不动地转发数据,以便通过代理在客户端和服务器之间建立端到端的TLS连接。

HTTP代理只应在完成连接请求后在客户端和服务器之间转发数据。它不应该在您尝试时处理TLS本身。相反,它应该原封不动地转发数据,以便在客户端与服务器之间通过代理建立端到端的TLS连接。

我遇到过这样的情况,我想知道您的客户端/浏览器是否支持TLS 1.3,而您的服务器只接受它?嗯,我真的不明白这是什么意思:(我接受http包,然后决定它仍然是http还是https。还有我在localhost上的代理服务器:8080(如果此信息很重要)。我偶然发现,我想知道您的客户端/浏览器是否支持TLS 1.3,而您的服务器只接受它?嗯,我真的不明白这是什么意思:(我接受http包,然后决定它是http还是https。还有我在本地主机上的代理服务器:8080(如果此信息很重要)。您的意思是我必须将数据传输到服务器,哪个客户端尝试连接?@GilmutdninovDaniil:On
connect host:port
请求代理应连接到给定的
host:port
,一旦成功,则
HTTP/1.0 200…
返回到客户端。从那时起,代理应转发从客户端读取的所有数据t发送到服务器,所有数据从服务器读取到客户端。不应对数据进行任何更改。我尝试了。但在我向客户端发送HTTP/1.0 200后,他向我发送了一条奇怪的消息(据我所知,这是握手的一部分,因此在我开始将数据从客户端传输到服务器之前,我必须使用代理与客户端握手)。当我在HTTP/1.0 200之后将数据发送到服务器(主机:主机)时,它会说这是一个错误的请求。@GilmutdninovDaniil:“因此,在我开始将数据从客户端传输到服务器之前,我必须使用我的代理与客户端握手”*-这完全不是您应该做的。代理应在连接请求完成后将所有数据从客户端转发到服务器,并将所有数据从服务器返回到客户端。代理不应与客户端进行TLS握手,而是将其转发,以便服务器可以进行握手。代理不应发送任何数据到客户端o在连接请求后,将服务器与所有客户端数据分开。因此,现在我不与代理进行握手,但错误是相同的:您的意思是我必须将数据传输到服务器,哪个客户端尝试连接?@GilmutdninovDaniil:On
连接主机:端口
请求代理应连接到给定的
主机:端口
,一旦成功然后将
HTTP/1.0 200…
返回到客户端。从那时起,代理应将从客户端读取的所有数据转发到服务器,并将从服务器读取的所有数据转发到客户端。不应对数据进行任何更改。我尝试了。但在我将HTTP/1.0 200发送到客户端后,他向我发送了一条奇怪的消息(据我所知,这是握手的一部分,所以在开始将数据从客户端传输到服务器之前,我必须使用代理与客户端握手)。当我在HTTP/1.0 200之后将数据发送到服务器(主机:主机)时,它会说这是一个错误的请求。@GilmutdninovDaniil:“所以,在我开始将数据从客户端传输到服务器之前,我必须用我的代理与客户端握手"*-这完全不是您应该做的。代理应在连接请求完成后将所有数据从客户端转发到服务器,并将所有数据从服务器返回到客户端。代理不应与客户端进行TLS握手,而是将其转发,以便服务器可以进行握手。代理不应发送任何数据到客户端o连接请求后,将服务器与所有客户端数据分开。因此,现在我不与代理进行握手,但错误相同: