2012-10-30 49 views
31

我正嘗試在我設置的Java客戶端和服務器之間建立SSL或TLS連接。SSL和TLS之間的區別以及它們在Java中的使用

我一直在使用SSLContext.getInstance("SSL")來構建SSLContext,它工作。

我想知道參數的用途是什麼SSLContext.getInstance(String protocol)

特別是,使用SSLContext.getInstance("SSL")SSLContext.getInstance("TLS")或其他可能的值之間有什麼變化?

+0

請參閱http://en.wikipedia.org/wiki/Transport_Layer_Security –

+3

您是否試過閱讀[documentation](http://docs.oracle.com/javase/6/docs/api/javax/net/ SSL/SSLContext.html#的getInstance%28java.lang.String 29%)? – Kai

+0

我搜索他們,並知道ssl,sslv3,tls之間的差異,我只是不知道服務器和客戶端之間的通信與不同的協議類型。謝謝 – user1781746

回答

0

協議用於服務器和客戶端之間的通信。因此SSLContext(String protocol)返回協議的實例,然後使用該服務器或客戶端相互通信以獲得安全級別。

欲瞭解更多參考鏈接。 http://www.herongyang.com/JDK/SSL-java-net-ssl-SSLContext-Class-Test.html

+0

我剛纔說過,在服務器上,我創建了一個協議'tls'。 SSLCOntext(String protocol)是指獲取客戶端協議嗎?我只是不明白爲什麼它起作用,在客戶端我調用SSLContext.getInstance(「ssl」)。 'ssl'和'tls'是不同的協議類型。我的英語不好,我很抱歉不清楚問題 – user1781746

+0

第一句話含糊不清。第二句不正確:getInstance()不返回'協議的實例';它重新運行SSLContext的一個實例。最後一段引用了非規範性和基本不相關的參考。 – EJP

+0

@Angel而不是擺弄刪除和取消刪除,爲什麼不*修復*它? – EJP

28

這是我回寫的一個rather detailed answer,描述了SSL和TLS之間的區別。簡而言之,TLS是SSL的繼承者,TLS 1.0可以被視爲「SSL 3.1」。

如果你看看JSSE Reference Guide, in the SSLContext section,它說:

這些靜態方法返回一個實現至少 所請求的安全套接字協議的實例。返回的實例也可能執行其他協議。例如,getInstance(「TLSv1」)可能會返回一個實現「TLSv1」,「TLSv1.1」和「TLSv1.2」的實例。

這也在Standard Names文件中提及。

特別是,如果您檢查SSLContextImpl的Oracle/OpenJDK 7源代碼,您會發現它的所有SSLContext都支持所有協議(從SSLv3使用SSLv2客戶端Hello到TLS 1.2)。不同的是默認啓用哪些協議。另外,由於其他Java實現(例如IBM JRE)的行爲可能會有所不同,因此您不應該依賴這一點。

如果你想要一組特定的協議用於連接,你應該使用SSLSocketSSLEnginesetEnabledProtocols方法。否則,它將使用默認值,如Providers documentation中所述。

相關問題