Java 服务器能否在一个端口上同时接受 SSL 和明文连接?

Posted

技术标签:

【中文标题】Java 服务器能否在一个端口上同时接受 SSL 和明文连接?【英文标题】:Can a Java server accept both SSL and plaintext connections on one port? 【发布时间】:2012-08-12 17:27:57 【问题描述】:

标题已经说明了。

如果我尝试将 ServerSocket 和 SSLServerSocket 绑定到同一个端口,我会收到错误消息。如果客户端尝试在没有 SSL 的情况下连接到 SSLServerSocket,accept() 方法将引发错误。如果客户端尝试通过 SSL 连接到 ServerSocket,我不知道如何建立安全连接。

有可能吗?

【问题讨论】:

【参考方案1】:

您可以接受正常的套接字连接,并在稍后使用SSLSocketFactory.createSocket(Socket s, String host, int port, boolean autoClose)(和服务器端的SSLSocket.setUseClientMode(false))将其升级到 SSL/TLS。

您需要在明文协议中定义一个命令,以便双方就升级达成一致(例如,类似于 SMTP 或 LDAP 中的STARTTLS 命令)。

或者,您可以使用端口统一(如can be done with Grizzly),从而尝试检测客户端是否使用 SSL/TLS 客户端 Hello 消息启动连接。这样做可能会更棘手,因为您必须提前阅读以检测数据包类型(因此您可能需要保留该缓冲区并将其内容传递到 SSLEngine,而不是能够使用 @987654327直接@)。

【讨论】:

或者使用 PushbackInputStream 来监听 SSL 客户端的问候。

以上是关于Java 服务器能否在一个端口上同时接受 SSL 和明文连接?的主要内容,如果未能解决你的问题,请参考以下文章

2003server服务器同时安装IIS和nginx服务器,能否同时使用80端口?

能否在一台主机上搭建2个tomcat服务器运行Java Web项目?

在 Java 客户端中接受服务器的自签名 ssl 证书

Java Mail:在没有 SSL 的端口 25 上发送电子邮件时出现 SSLHandshakeException

如何在端口 80 上执行 SSL 操作

普通套接字与 SSL 套接字