【问题标题】:Respond to HTTP CONNECT in proxy在代理中响应 HTTP CONNECT
【发布时间】:2014-05-26 21:53:32
【问题描述】:

我目前正在实施代理。 这是一个特殊的代理,它只回复以前记录的请求 (它有一个请求/响应数据库,并在收到请求后返回匹配项, 此数据库是使用 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

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

谢谢

【问题讨论】:

    标签: ssl proxy


    【解决方案1】:

    (也许this question 可能会感兴趣。)

    普通的 HTTPS 代理会处理 CONNECT 请求,与 myserver:9443 建立 TCP 连接,如果此连接建立成功,则向客户端返回 200 状态代码。在此之后,它只是在客户端和目标服务器之间中继所有内容,而无需查看它。

    由于您尝试实现 MITM 代理(也可以离线),因此您必须通过将进出客户端的流量重定向到伪 HTTPS 服务器来模拟与实际服务器的连接。

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

    您还可以即时生成证书。通常,您的代理服务器可以拥有自己的 CA,您可以将其 CA 证书导入客户端的信任锚。使用该 CA,在将任何 SSL/TLS 数据从客户端发送到您的伪服务器之前,生成一个使用该 CA 签名的证书,该证书对请求的主机名有效(您可以从 CONNECT 获得),并配置您的伪服务器接着就,随即。如果没有这一步,客户应该抱怨无效的证书。

    【讨论】:

    • 可能根本就没有连接到受 SSL 保护的服务器(而是建立了一些其他协议的隧道),因此该任务没有通用解决方案。
    • 感谢布鲁诺的详细解释。在阅读本文并查看 MITM 代理 (mitmproxy.org/doc/howmitmproxy.html) 的示例后,我明白了。我已经用 PHP 编写了代理,我想你提到了一个 Python 库,我希望为此找到一个好的 PHP 库:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2014-01-11
    • 1970-01-01
    • 2014-08-30
    • 2013-09-15
    • 2013-09-14
    相关资源
    最近更新 更多