2015-04-22 160 views
0

我使用Java 6中(SunJSSE)像這樣的默認JSSE供應商,SSLContext.createSSLEngine()線程安全嗎?

SSLContext sslCtx = SSLContext.getInstance("TLS");

我可以從多個線程調用該方法sslCtx.createSSLEngine()安全?

更新1: 是在呼喚以這種方式createSSLEngine()的代碼在服務器端上運行。基本上,一個線程爲連接到服務器的每個客戶端調用此方法。

+0

它並沒有這麼說,但我從不擔心它,也從未被抓過。但是,如果可能的話,你應該調用'SSLContext.createSSLEngine(String host,int port)',否則你不會得到任何'SSLSession'共享。 – EJP

+0

@EJP我只能找到[this old post](http://dev.mina.apache.narkive.com/VVCDUDuQ/sslfilter-and-ssl-session-reuse)提到SSLSession重用。但是,它表示這隻影響客戶端代碼。你有關於此事的更多信息嗎? –

+0

這是不正確的。服務器也參與會話重用,而SSLEngine只有這種方式才能知道對方是誰,所以哪些會話與對方有關。 – EJP

回答

2

SSLContext.createSSLEngine()的調用似乎是線程安全的。至少基於應用程序沒有因任何與種族條件相關的錯誤而失敗的事實。

在試圖找到一個明確的答案,我下載了OpenJDK6 b27的源代碼,並看看它。我假設,當然,這是相同的代碼,甲骨文的JRE 6

內當SSLContext.createSSLEngine()被調用,它反過來調用它具有javax.net.ssl.SSLContextSpi類的任何實現的抽象方法engineCreateSSLEngine()。在這種情況下,實施是sun.security.ssl.SSLContextImplSSLContextImpl提供的engineCreateSSLEngine()方法的實現通過調用SSLEngineImpl(SSLContextImpl ctx)構造函數返回一個新實例sun.security.ssl.SSLEngineImpl

檢查代碼,我找不到任何可能導致線程不安全的操作。