2012-08-16 24 views
2

标题说明。Java服务器可以在一个端口上同时接受SSL和明文连接吗?

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

这有可能吗?

+2

你为什么想这样做? – 2012-08-16 11:11:38

回答

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)。

+3

或者使用PushbackInputStream来监听SSL客户端。 – EJP 2012-08-16 23:45:27

相关问题