如何使SSL服务器套接字同时支持http和&在java中的https?

时间:2015-05-28 05:51:03

标签: java sockets sslsocketfactory

我正在尝试使用java套接字创建简单的Web服务器,它应支持http和& HTTPS。但我一次只能实现一个。我需要逻辑支持http @ port 80&同时https @port 443。
这是使用sslsocket的HTTPS服务器的示例代码。我们可以使用简单的ServerSocket实现HTTP Server。

public class HttpsServer {
    public static void main(String[] args) {
    try {
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream("/opt/p12file.p12"), "p12pass".toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, "p12pass".toCharArray());

        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(kmf.getKeyManagers(), null, null);

        SSLServerSocketFactory ssf = sc.getServerSocketFactory();
        SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(8080);

        while (true) {
            SSLSocket c = (SSLSocket) s.accept();
            BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
            w.write("HTTP/1.0 200 OK");
            w.newLine();
            w.write("Content-Type: text/html");
            w.newLine();
            w.newLine();
            w.write("<html><body><h1>Https Server Works</h1></body></html>");
            w.newLine();
            w.flush();
            w.close();
            c.close();
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

  

如何使SSL服务器套接字同时支持http和&amp;在java中使用https?

你不能。 HTTP是纯文本,SSLServerSocket无法支持。

  

我试图使用java套接字创建简单的Web服务器,它应该支持http和&amp; HTTPS。但我一次只能实现一个。我需要逻辑支持http @ port 80&amp;同时https @port 443。

你需要:

  • 以80
  • 收听的明文ServerSocket
  • SSLServerSocket收听443
  • 每个
  • 的接受循环线程
  • 每个接受套接字的连接线程。

您永远不会在静态main()方法中完成它。我建议你阅读“自定义网络”#39; Java教程的一节,然后是JSSE参考指南。

您当然还需要非常好地了解RFC 2616 HTTP 1.1。正确实施是非常重要的。

正如评论中所建议的那样,你应该使用现成的东西。

答案 1 :(得分:2)

您有两个选择:

  • 使用两个不同的端口,一个用于http,一个用于https。

  • SSL Hello检测/端口统一:

    在HTTP和HTTPS中,客户端应首先进行对话。因此服务器可以使用它来检测客户端期望的协议:

    • 如果客户端发送TLS ClientHello,则进行TLS握手;
    • 如果发送的是纯HTTP请求,请照原样处理请求。

更多信息: