【发布时间】:2013-09-17 14:15:55
【问题描述】:
整个代码非常复杂,所以我直接进入重点。 代码如下
SSLContext ctx = SSLContext.getInstance("TLS");
如果您阅读 docs 的 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.Provider 上下文中的相同com.sun.net.ssl.internal.ssl.SSLContextImpl@7bbf68a9 SSLContextSpi 对象(这两种情况都相同)。
【问题讨论】: