TrustManager[] trustManagers = new TrustManager[]{new X509TrustManagerImpl()}; SSLContext sslContext = SSLContext.getInstance("TLSv1.1"); sslContext.init(null, trustManagers, new SecureRandom()); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext); return sslConnectionSocketFactory;
=================================== jdk7: --------------- sslContext = SSLContext.getDefault().getInstance("TLS") 支持的协议会传TLSv1 可连通支持TLSv1的服务端,TLSv1.1或TLSv1.2的不通。
SSLConnectionSocketFactory.getSocketFactory() 同上
sslContext = SSLContext.getDefault().getInstance("TLSv1.1") 支持的协议会传TLSv1,TLSv1.1 可连通支持TLSv1或TLSv1.1的服务端,TLSv1.2的不通。
sslContext = SSLContext.getDefault().getInstance("TLSv1.2") 支持的协议会传TLSv1,TLSv1.1,TLSv1.2 可连通支持TLSv1或TLSv1.1或TLSv1.2的服务端。
结论:直接使用TLSv1.2,可以兼容v1,v1.1和v1.2三者。 --------------- (1)JDK 7初始版本(Java 7最初发布时): 默认使用的是TLSv1.0。 不支持TLSv1.1或TLSv1.2。
(2)JDK 7的后续更新(Java 7uXX): 从Java 7u95开始,Oracle在更新中启用了对TLSv1.1和TLSv1.2的支持,但默认仍然是TLSv1.0。 如果需要使用TLSv1.1或TLSv1.2,需要显式配置(通过jdk.tls.client.protocols参数或代码中设置)。 注意jdk.tls.client.protocols参数,需要7u95版本后才好使。 -----------------------
jdk8: --------------- 基本同上,只是jdk8默认是TLSv1.2了, 所以getInstance("TLS")效果等同于getInstance("TLSv1.2")
================================= 以下说的是jdk1.8: (1)SSLContext.getInstance("TLS"),那么会创建一个TLSContext, 支持的协议自动会写TLSv1.0,TLSv1.1,TLSv1.2, 然后与服务端自动协商用哪个版本。
(2)直接SSLConnectionSocketFactory.getSocketFactory()也行, 它里面实际是:
final SSLContext sslcontext = SSLContext.getInstance(SSLContextBuilder.TLS); sslcontext.init(null, null, null); return sslcontext;
(3)想这样,会报错 SSLContext sslContext = SSLContext.getDefault(); sslContext.init(null, trustManagers, new SecureRandom()); 报错如下:
Caused by: java.security.KeyManagementException: Default SSLContext is initialized automatically at sun.security.ssl.SSLContextImpl$DefaultSSLContext.engineInit(SSLContextImpl.java:930) at javax.net.ssl.SSLContext.init(SSLContext.java:282)
原因是: Java 会在首次使用 HTTPS 相关功能时(如第一次发起 HttpsURLConnection 请求)自动初始化默认的 SSLContext。如果你之后尝试修改它(例如,强制使用特定的 TLS 版本或自定义信任管理器),就会抛出。
所以这种方式就不尝试了。 ---------------------------- java官网参考文档: https://www.java.com/en/configure_crypto.html
|