2012-08-16 23 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

相關問題