[英]Java HTTP Proxy chaining over mTLS using multithreaded sockets
我正在尝试在本地侦听套接字以用作 HTTP 代理并将所有内容 (TCP) 转发到另一个受相互 TLS 保护的 HTTP 代理。
我环顾四周,但还没有找到可以帮助我实现这个目标的库,所以我选择了原始的 java.net.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) {}
}
}
}
不,这不是正确的方法,因为服务器端套接字处理一团糟。
使用(休息/肥皂服务)库,如jersey 。 其他图书馆也会做同样的工作。 ;-)
编辑:现在,我明白了。 你需要一个 TCP 代理/TCP 隧道。 是的,球衣对你来说是错误的工具。 但是有一些用 java fe oksuz/tcp-proxy编写的TCP-Proxy 。 这里的其他人也有同样的要求,我认为Java 隧道和 tcp 代理
也许这可以帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.