我使用Java 6中(SunJSSE)像這樣的默認JSSE供應商,SSLContext.createSSLEngine()線程安全嗎?
SSLContext sslCtx = SSLContext.getInstance("TLS");
我可以從多個線程調用該方法sslCtx.createSSLEngine()
安全?
更新1: 是在呼喚以這種方式createSSLEngine()
的代碼在服務器端上運行。基本上,一個線程爲連接到服務器的每個客戶端調用此方法。
我使用Java 6中(SunJSSE)像這樣的默認JSSE供應商,SSLContext.createSSLEngine()線程安全嗎?
SSLContext sslCtx = SSLContext.getInstance("TLS");
我可以從多個線程調用該方法sslCtx.createSSLEngine()
安全?
更新1: 是在呼喚以這種方式createSSLEngine()
的代碼在服務器端上運行。基本上,一個線程爲連接到服務器的每個客戶端調用此方法。
對SSLContext.createSSLEngine()
的調用似乎是線程安全的。至少基於應用程序沒有因任何與種族條件相關的錯誤而失敗的事實。
在試圖找到一個明確的答案,我下載了OpenJDK6 b27的源代碼,並看看它。我假設,當然,這是相同的代碼,甲骨文的JRE 6
內當SSLContext.createSSLEngine()
被調用,它反過來調用它具有javax.net.ssl.SSLContextSpi
類的任何實現的抽象方法engineCreateSSLEngine()
。在這種情況下,實施是sun.security.ssl.SSLContextImpl
。 SSLContextImpl
提供的engineCreateSSLEngine()
方法的實現通過調用SSLEngineImpl(SSLContextImpl ctx)
構造函數返回一個新實例sun.security.ssl.SSLEngineImpl。
檢查代碼,我找不到任何可能導致線程不安全的操作。
它並沒有這麼說,但我從不擔心它,也從未被抓過。但是,如果可能的話,你應該調用'SSLContext.createSSLEngine(String host,int port)',否則你不會得到任何'SSLSession'共享。 – EJP
@EJP我只能找到[this old post](http://dev.mina.apache.narkive.com/VVCDUDuQ/sslfilter-and-ssl-session-reuse)提到SSLSession重用。但是,它表示這隻影響客戶端代碼。你有關於此事的更多信息嗎? –
這是不正確的。服務器也參與會話重用,而SSLEngine只有這種方式才能知道對方是誰,所以哪些會話與對方有關。 – EJP