我使用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