Java7 HTTPS 支持 TLS 1.1 TLS 1.2

在Java SE 7 中,SunJSSE 支持TLS 1.1 and TLS 1.2。但是考虑到当时(since 2011)很多服务器对这两个协议支持的不好,就把这两个版本的协议禁用,默认使用TLS 1.0。

如果要启用这两个协议的支持也很简单:

设置系统属性

https.protocols

指定Java HTTPS连接(HttpsURLConnectionURL.openStream())使用的协议版本。

验证代码

-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2

TLSv1 是不安全的协议,不建议在生产环境中使用。

TLS 与 HTTPS的关系

HTTPS是传输协议,TLS只是它的加密方式,比如还可以用更不安全的SSL2,SSL3。
TLS也不仅仅使用在HTTPS里,使用JDBC连接数据库时也可以启用TLS加密。

Apache HttpClient

使用Apache HttpClient 时会发现这个配置并不生效,这是因为它默认不读取Java系统属性,需要显示的指定useSystemProperties()

使用系统属性

验证代码

如何不影响全局

修改系统属性,整个JVM都会受到影响。如果希望把影响范围降到最低,可以通过定制HttpClients的方式。

验证代码

unable to find valid certification path to requested target

如果拿我的域名做测试,还会报这个异常。因为我的HTTPS证书是申请LetsEncrypt的。JDK7发布时,LetsEncrypt还不存在,所以JDK7的证书里不识别它,需要手动加载一下。

>= 7u151, 8u141 就不需要手动加载证书了。
$JAVA_HOME 需要指向JDK7或其它低版本JDK。

参考链接:
Java Cryptography Architecture Oracle Providers Documentation for Java Platform Standard Edition 7

评论关闭。