2016-08-19 67 views
-1
Socket fromServer = new Socket("host", 443); 

    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket sslsocket = (SSLSocket) factory.createSocket(fromServer, null, true); 
    sslsocket.setUseClientMode(true); 

我嘗試,但得到 「javax.net.ssl.SSLException:收到致命警報:INTERNAL_ERROR」如何在握手之前寫入SSLSocket?

如果我使用的SSLSocket直接它的工作(factory.createSocket( 「主機」,443);)

地址: 我需要添加自定義頭之前的握手,爲實現自定義的協議

ADD2: 代碼工作!它是我的失敗,我測試服務器與SNI

+0

你想達到什麼目的? – Fildor

+0

Fildor,爲自定義協議添加自定義標頭 – inter

+0

請看這裏:http://blog.trifork.com/2009/11/10/securing-connections-with-tls/ – Fildor

回答

3

SSLSocket在TLS連接內傳輸數據。在傳輸數據之前需要建立TLS連接,即握手必須成功完成。因此,在握手完成之前寫入SSLSocket是沒有意義的,這與在TCP連接建立之前寫入TCP套接字沒有意義相同。

補充:我需要添加自定義頭之前的握手,爲實現自定義的協議

後得到添加了這個信息的問題更有意義。看起來您希望先交換未加密的數據,然後稍後升級到TLS,例如在SMTP + STARTTLS中完成。在這種情況下,您需要先建立一個正常的TCP連接,然後再升級到TLS。請參閱Is it possible to change plain socket to SSLSocket?瞭解如何做後半部分。

+0

我知道它。我需要添加自定義標題BEFORE握手,實現自定義協議 – inter

+0

那麼它確實有意義,如果您的協議允許安全**和**不安全的通信。如果你想通過同一個端口來處理,你可以裸體地開始,只要雙方同意使用SSL/TLS,他們就可以啓動TLS。一個例子是SMTP ... – Fildor

+0

Fildor,這是正確的 – inter