[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]关于https的SSLContext版本

上一篇:[备忘]windows下合并分卷文件
下一篇:[备忘]检查服务器实际支持的协议openssl

添加日期:2025/6/9 17:02:11 快速返回   返回列表 阅读19次


        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
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved