2015-04-22 24 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

检查代码,我找不到任何可能导致线程不安全的操作。