当前位置: 首页 > 面试题库 >

创建一个接受HTTPS的Java代理服务器

杨雪松
2023-03-14
问题内容

我已经有一个工作正常的HTTP代理服务器,可以处理多个HTTP请求。现在我的问题是如何处理https请求?

这是我正在使用的简化代码:

class Daemon
{
    public static void main(String[] args)
    {
        ServerSocket cDaemonSocket = new ServerSocket(3128);

        while(true)
        {
          try
          {
             Socket ClientSocket = cDaemonSocket.accept();
             (new ClientHandler(ClientSocket )).start();
          }catch(Exception e) { }
        }
    }

}

和ClientHandler

class ClientHandler extends Thread
{
        private Socket socket = null;
        private Socket remoteSocket = null;
        private HTTPReqHeader request = null;
        ClientHandler(Socket socket)
        {
           this.socket = socket;
           request = new HTTPReqHeader();
           request.parse(socket); // I read and parse the HTTP request here
        }

       public void run()
       {
            if(!request.isSecure() )
            {
              remoteSocket = new Socket(request.url,request.port);
            }
            else
            {
              // now what should I do to established a secured socket?
            }

            // start connecting remoteSocket and clientSocket 
            ...........
       }
}

}

我确实确实尝试搜索过,但是遇到SSL隧道,证书,握手,SSLSocket,SSLFactory,trustStore等问题,但是仍然无法正常工作。我只需要知道我需要什么,以及建立与启用SSL的Web服务器的连接的步骤。


问题答案:

我终于明白了。

我只需要使用普通套接字,并向客户端发送一条消息,表明已建立连接。然后继续挖掘。

这是一个工作代码:

private Socket socket = null;
        private Socket remoteSocket = null;
        private HTTPReqHeader request = null;
        ClientHandler(Socket socket)
        {
           this.socket = socket;
           request = new HTTPReqHeader();
           request.parse(socket); // I read and parse the HTTP request here
        }

       public void run()
       {

            remoteSocket = new Socket(request.url,request.port);

            if(request.isSecure() )
            {
                 // send ok message to client
                 String ConnectResponse = "HTTP/1.0 200 Connection established\n" +
                                          "Proxy-agent: ProxyServer/1.0\n" +
                                          "\r\n";
                try
                {
           DataOutputStream out =  new DataOutputStream(socket.getOutputStream());
                   out.writeByte(ConnectResponse);
                    out.flush();
                } catch(Exception e) {}

            }

            // start connecting remoteSocket and clientSocket 
            ...........
       }

这是有关代理服务器如何处理CONNECT的很好的解释。 http://curl.haxx.se/rfc/draft-luotonen-web-proxy-
tunneling-01.txt



 类似资料:
  • 问: Workerman如何创建一个https服务,使得客户端可以用过https协来连接通讯。 答: https协议实际是http+SSL,就是在http协议上加入SSL层。Workerman支持http协议,同时也支持SSL(需要Workerman版本>=3.3.7), 所以只需要在http协议的基础上开启SSL即可支持https协议。 Workerman开启SSL 准备工作: 1、Worker

  • 我得到下面的错误,当做docker组成。该应用程序正在运行,但不能使任何api发布/获取请求。快速服务器正在使用端口5000。 ]尝试从localhost:3000代理请求/api/users/user时发生[HPM]错误http://localhost:5000/ (经济学)(https://nodejs.org/api/errors.html#errors_common_system_erro

  • 问: Workerman如何创建一个https服务,使得客户端可以用过https协来连接通讯。 答: https协议实际是http+SSL,就是在http协议上加入SSL层。Workerman支持http协议,同时也支持SSL(需要Workerman版本>=3.3.7), 所以只需要在http协议的基础上开启SSL即可支持https协议。 Workerman开启SSL 准备工作: 1、Worker

  • 问题内容: 我目前正在尝试使用pywin32创建一个win32服务。我的主要参考点是本教程: http://code.activestate.com/recipes/551780/ 我不了解的是初始化过程,因为Daemon从不直接通过Daemon()进行初始化,而是从我的理解中,它是通过以下方式进行初始化的: 其中 svc_install 通过调用守护程序处理 初始化 。 init ()并将一些参

  • 我正在使用Jersey 2.x和内置在Jersey中的HK2。我需要在我的服务中用注释标记某些方法,也就是说,我想在这些方法调用之前和之后执行一些额外的操作。不幸的是,HK2没有任何AOP能力。我认为只要调用工厂的方法,就可以将工厂绑定到服务的接口,并创建服务的代理。然而,我需要一些东西到我的工厂工作: 1)创建代理的服务类和接口

  • 我有最困难的时候让我的webpack开发服务器代理到我的后端。 我使用Vue和webpack cli模板。 我的后端托管在docker容器中,可以在localhost:8443/foo上看到 我的devServer配置设置为: 正如我前面所说,当我将浏览器指向https://localhost:8443/foo 当我运行我的webpack服务器,并试图https://localhost:9000/