在代理中响应HTTP CONNECT



我目前正在实现一个代理。这是一个特殊的代理,它只响应先前记录的请求(它有一个请求/响应的数据库,并在接收请求时返回匹配,这个数据库是使用Fiddler生成的)。事实上它是离线的。

对于没有SSL的站点可以正常工作,但是对于SSL站点,有一个CONNET HTTP消息

CONNECT myserver:9443 HTTP/1.1
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 Safari/534.34
Host: myserver

我不知道收到这个请求后应该返回什么?

谢谢

(也许你会对这个问题感兴趣。)

一个正常的HTTPS代理会处理CONNECT请求,建立一个到myserver:9443的TCP连接,如果这个连接建立成功,返回一个200状态码给客户端。在此之后,它只是在客户机和目标服务器之间传递所有内容,而不查看它。

由于您正在尝试实现MITM代理(也脱机),因此您将不得不通过将流量重定向到客户端或从客户端重定向到伪HTTPS服务器来模拟与实际服务器的连接。

你可以通过实现一个假的套接字类并通过ssl.wrap_socket包装它来做到这一点。(假定,由于您的应用程序已经在离线的纯HTTP下工作,因此您已经完成了一些工作来模拟使用离线数据读取和写入伪套接字。)

您还可以动态生成证书。通常,您的代理服务器可以拥有自己的CA,您可以将其CA证书导入客户机的信任锚。在将任何SSL/TLS数据从客户机发送到您的伪服务器之前,使用该CA生成一个用该CA签名的证书,该证书对请求的主机名有效(可以从CONNECT获得),并用该证书配置您的伪服务器。如果不执行此步骤,客户端将会报错无效的证书。

最新更新