整个代码很复杂,所以我直接进入重点。代码如下
SSLContext ctx = SSLContext.getInstance("TLS");
如果您阅读getInstance(String protocol) 方法的文档,它会说
This method traverses the list of registered security Providers, starting
with the most preferred Provider. A new SSLContext object encapsulating
the SSLContextSpi implementation from the first Provider that supports the
specified protocol is returned.
Note that the list of registered providers may be retrieved via the
Security.getProviders() method.
对我来说 Security.getProviders() 方法提供以下提供者
现在我已经验证了“TLS”协议在com.sun.net.ssl.internal.ssl.Provider
(索引 2)中并且总是被选中。
但是相应的 SSLContextSpi 对象在 Java 6 和 Java 7 中有所不同。在 java 6 中,我得到了com.sun.net.ssl.internal.ssl.SSLContextImpl@7bbf68a9
,而在 java 7 中,我得到了sun.security.ssl.SSLContextImpl$TLS10Context@615ece16
. 这会产生非常糟糕的影响,因为稍后我创建 SSL 套接字时它们属于不同的类。
那么为什么会这样呢?有解决办法吗?我希望将相同的com.sun.net.ssl.internal.ssl.SSLContextImpl@7bbf68a9
SSLContextSpi 对象封装在com.sun.net.ssl.internal.ssl.Provider
上下文中(在两种情况下都是相同的)。