标题说明了。
如果我尝试将ServerSocket和SSLServerSocket绑定到同一个端口,则会出错。如果客户端尝试连接到不带SSL的SSLServerSocket,则accept()方法会引发错误。如果客户端尝试通过SSL连接到ServerSocket,我不知道如何建立安全连接。
甚至可能吗?
答案 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
。