Java服务器是否可以在一个端口上同时接受SSL和纯文本连接?

时间:2012-08-16 11:10:10

标签: java ssl port

标题说明了。

如果我尝试将ServerSocket和SSLServerSocket绑定到同一个端口,则会出错。如果客户端尝试连接到不带SSL的SSLServerSocket,则accept()方法会引发错误。如果客户端尝试通过SSL连接到ServerSocket,我不知道如何建立安全连接。

甚至可能吗?

1 个答案:

答案 0 :(得分:2)

您可以使用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,而不是能够使用直接SSLSocket