在代理服务器的HTTPS中建立连接的问题。((连接方法)

问题描述 投票:0回答:1

我正在开发基于Java的代理服务器。对于简单的http请求,代理服务器正在工作。但是对于HTTPS连接,连接会超时。这是我所做的步骤。我首先从输入流中读取一行,并创建了一个连接Server的套接字。之后,我给客户200状态。之后,我在客户端套接字和服务器套接字之间进行异步读写。但是目前这不起作用,并且连接超时,我无法调试问题。

public class ProxyServer extends Thread {
private String host;
private int port;
private ServerSocket serverSocket;
private InputStream proxyToClientIP;
private OutputStream proxyToClientOP;
private InputStream proxyToServerIP;
private OutputStream proxyToServerOP;
private Socket socket;
private Socket socketFromProxyServer;


ProxyServer(ServerSocket serverSocket, Socket socket) {
    this.serverSocket = serverSocket;
    this.socket = socket;
    this.start();
}

public void run() {
    processInputRequest();
}

public void processInputRequest() {
    try {
        proxyToClientIP = socket.getInputStream();
        proxyToClientOP = socket.getOutputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(proxyToClientIP));
        String hostDetails = reader.readLine();
        System.out.println(hostDetails);
        boolean isConnect = false;
        //Need to parse request and find req type as GET or CONNECT
        //As of now we assume it to be Connect request
        if (!isConnect) {
            processGetRequest();
        } else {
            processConnectRequest();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public void processConnectRequest() {
    //Need to get host name from request. Currently Hardcoded for developing purpose
    host = "harish-4072";
    port = 8383;
    try {
        socketFromProxyServer = new Socket(host, port);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(proxyToClientOP));
        writer.write("HTTP/1.1 200 Connection established\r\n" + "\r\n");
        writer.flush();
        proxyToServerOP = socketFromProxyServer.getOutputStream();
        proxyToServerIP = socketFromProxyServer.getInputStream();
        proxyRequest();
    } catch (IOException ex) {
        System.out.println(ex);
    }
}




public void proxyRequest() {
    try {
        new Thread() {
            @Override
            public void run() {
                try {
                    byte[] read = new byte[1024];
                    int in;
                    System.out.println("Reading");
                    while ((in = proxyToClientIP.read(read)) != -1) {
                        proxyToServerOP.write(read, 0, in);
                        proxyToServerOP.flush();
                    }
                } catch (SocketException e) {
                    System.out.println(e);
                } catch (IOException ex) {

                }
            }
        }.start();
        byte[] reply = new byte[1024];
        int out;
        System.out.println("Writing");
        while ((out = proxyToServerIP.read(reply)) != -1) {
            proxyToClientOP.write(reply, 0, out);

            proxyToClientOP.flush();
        }
    } catch (IOException ex) {

    }

    public void processGetRequest() {
   //
   }
}
java ssl https proxy tunnel
1个回答
1
投票

我首先读一行从输入流中创建了一个连接Server的套接字。 ...之后,我在客户端套接字和服务器套接字之间进行异步读写。

问题是,您只需要读取一行,而您需要从客户端读取完整的HTTP请求标头,即直到请求标头(\r\n\r\n)末尾的所有内容。

因为您没有这样做,所以HTTP请求的未读部分被转发到服务器。但是服务器希望TLS握手开始,并且这些数据会使服务器感到困惑。这可能会导致挂起或中止,具体取决于数据的内容和一种服务器。

© www.soinside.com 2019 - 2024. All rights reserved.