【问题标题】:Java HTTP Proxy chaining over mTLS using multithreaded sockets使用多线程套接字在 mTLS 上链接 Java HTTP 代理
【发布时间】:2020-09-24 05:33:01
【问题描述】:

我正在尝试在本地侦听套接字以用作 HTTP 代理并将所有内容 (TCP) 转发到另一个受相互 TLS 保护的 HTTP 代理。

我环顾四周,但还没有发现可以帮助我实现这个目标的库,所以我选择了原始 java.net.Socket。 但是,套接字和连接管理很麻烦,会导致“套接字关闭”错误,并且大多数情况下根本没有收到响应或连接重置。这是在两个 Socket 之间传递所有内容的正确方法吗?

public class ThreadServer
implements Runnable
{
    private final ServerSocket inSocket;
    private final SSLSocketFactory socketFactory;
    private final String proxyHost;
    private final int proxyPort;

    public ThreadServer(final SSLSocketFactory socketFactory,
                        final String proxyHost, final int proxyPort,
                        final ServerSocket inSocket)
    {
        this.proxyHost = proxyHost;
        this.proxyPort = proxyPort;
        this.socketFactory = socketFactory;
        this.inSocket = inSocket;
    }

    private void process(Socket acceptSocket, Socket sendSocket)
    throws IOException
    {
        try (final InputStream inFromClient = acceptSocket.getInputStream();
             final OutputStream outToClient = acceptSocket.getOutputStream();
             final InputStream inFromServer = sendSocket.getInputStream();
             final OutputStream outToServer = sendSocket.getOutputStream())
        {
            new Thread(() -> {
                try {
                    // can blocking indefinetely so run in a separate Thread
                    inFromClient.transferTo(outToServer);
                } catch (IOException ignored) {}
            }).start();

            // now copy everything from response back to the client, blocking as wel
            inFromServer.transferTo(outToClient);
        } finally {
            acceptSocket.close();
            sendSocket.close();
        }
    }

    @Override
    public void run()
    {
        while (true) {
            try {
                Socket socket = this.inSocket.accept();
                Socket tlsSocket = socketFactory.createSocket(
                SocketFactory.getDefault().createSocket(proxyHost, proxyPort), proxyHost, proxyPort, true);
                process(socket, tlsSocket);
            } catch (IOException ignored) {}
        }
    }
}

【问题讨论】:

    标签: java sockets proxy


    【解决方案1】:

    不,这不是正确的方法,因为服务器端的套接字处理是一团糟。

    使用(休息/肥皂服务)库,如jersey。其他图书馆也会做同样的工作。 ;-)

    编辑:现在,我明白了。你需要一个 TCP-Proxy / TCP-Tunnel。是的,球衣对你来说是错误的工具。但是有一些用 java f.e. 编写的 TCP-Proxy。 oksuz/tcp-proxy 。这里的其他人也有同样的要求,我想Java tunnel and tcp proxy

    也许这对你有帮助。

    【讨论】:

    • 完全同意,但我从 Jetty 或 Jersey 看到的示例都使用常规 HTTP,而我需要一个 HTTP Web 代理协议。 (连接等)
    猜你喜欢
    • 2020-03-28
    • 2016-07-23
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多