【问题标题】:How make SSL server socket support both http & https in java?如何使 SSL 服务器套接字在 java 中同时支持 http 和 https?
【发布时间】:2015-05-28 05:51:02
【问题描述】:

我正在尝试使用应该支持 http 和 https 的 java 套接字创建简单的 web 服务器。但我一次只能实现一个。我需要同时支持 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();
    }
}

}

谁能帮帮我吗?

【问题讨论】:

  • 为什么不使用 Web 容器?你真的想自己实现http协议吗?
  • 我正在尝试在 android 应用程序中实现这些功能。 @StevenPessall
  • 一个用作HttpServer的android应用?老实说,这听起来像是一个混乱的系统设计。
  • 它不是 android 中成熟的 HTTP 服务器。只是一个简单的后台服务,当从浏览器发布内容时,它使用套接字获取 httpresponse。我将http服务器(基于socket)和https服务器(基于sslsocket)分别实现为android应用程序。现在我想合并这些东西。谢谢。 @StevenPessall

标签: java sockets sslsocketfactory


【解决方案1】:

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

你不能。 HTTP 是明文,SSLServerSocket 不支持。

我正在尝试使用应该支持 http 和 https 的 java 套接字创建简单的 web 服务器。但我一次只能实现一个。我需要同时支持 http @ port 80 和 https @ port 443 的逻辑。

你需要:

  • 纯文本ServerSocket 80 监听
  • SSLServerSocket 在 443 收听
  • 每个都有一个接受循环线程
  • 每个接受的套接字都有一个连接线程。

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

您当然还需要好好看看 RFC 2616 HTTP 1.1。正确实现是极其重要的。

按照 cmets 的建议,您应该真正使用现成的东西。

【讨论】:

    【解决方案2】:

    你有两个选择:

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

    • SSL Hello 检测/端口统一:

      在 HTTP 和 HTTPS 中,客户端应该首先交谈。所以服务器可以使用它来检测客户端期望的协议:

      • 如果客户端发送 TLS ClientHello,则继续进行 TLS 握手;
      • 如果改为发送纯 HTTP 请求,则按原样处理请求。

    更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2023-02-08
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多