【问题标题】:Creating a Java HTTPS Proxy in-order to record HTTP traffic创建 Java HTTPS 代理以记录 HTTP 流量
【发布时间】:2013-12-18 17:06:18
【问题描述】:

我正在实现自己的代理来记录 HTTP 流量。 从我到目前为止的研究来看,这并非微不足道,因为第一个请求(CONNECT)是在没有通过 HTTP 加密的情况下完成的(在端口 443 上 - 使用常规服务器套接字)继续通过 HTTP(HTTPS)隧道到 SSL,这需要由一个安全服务器套接字(取自 SLServerSocketFactory)。

换句话说,在第一个 CONNECT 请求之后,我需要将实现从非安全切换到安全服务器套接字。

除此之外,我正在使用基于服务器证书的自定义密钥库和信任库(这一步没有问题)。

感谢您的想法或您可能拥有的任何示例。

【问题讨论】:

    标签: java https proxy network-programming


    【解决方案1】:

    这是极其微不足道的。

    1. 从接受的套接字读取一行。这就是连接。获取目标主机。
    2. 连接到目标。这是“上游”连接,另一个是“下游”连接。
    3. 如果失败,请发回适当的 HTTP 响应并关闭套接字。
    4. 否则,启动两个线程,一个将字节从下游复制到上游,一个将字节从上游复制到下游。
    5. 当您在其中一个线程中的套接字上读取 EOS 时,请关闭它写入的套接字以进行输出并退出线程。
    6. 当您这样做时,请检查您读取的套接字是否已关闭以进行输出。如果有,请在退出线程之前关闭两个套接字。

    因此,当双向读取 EOS 时,两个套接字都已关闭,并且两个线程都已退出。这种关闭技术可以解决所有可能的保持活动困难。

    当您复制字节时,您丝毫不关心其中的内容。客户端将使用上游服务器完成所有 SSL 工作。你不需要知道任何事情。

    【讨论】:

    • 首先,由于我记录了流量并且以后可能会更改它,因此查看解密的流量对我来说很重要,其次,您描述的内容仅适用于常规 HTTP 流量而不是 HTTPS(SSL over HTTP)。
    • 首先,如果你需要记录流量,这个是行不通的。其次,如果你不需要记录流量,它会,包括HTTPS。 CONNECT 仍然以明文形式发送。我有执行此操作的生产部署。
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2012-11-23
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多