问题描述
java应用调用HTTPS服务器的接口时报错:
The server selected protocol version TLS10 is not accepted by client preferences [TLS12].
原因分析
HTTPS服务器使用的TLS协议的版本是TLSv1.0,而TLSv1.0、TLSv1.1都过时了(现代浏览器已经停止支持TLSv1.0和TLSv1.1,HTTPS服务器至少应该在TLS1.2上运行。如果站点仍然使用旧的TLS版本,则可能会触发ERR_SSL_VERSION_OR_CIPHER_MISMATCH错误。),高版本的 JDK 禁用了 TLSv1.0。
参考链接:
https://blog.csdn.net/wangjingyuing/article/details/121060124
https://cloud.tencent.com/developer/article/2127522
https://www.jianshu.com/p/35a5edb23d96
解决方法:
方法1: 直接修改java.security文件
打开 java.security 文件之后,修改 jdk.tls.disabledAlgorithms= 后面的值,删除 TLSv1, TLSv1.1 和 3DES_EDE_CBC 即可。
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA,
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL,
include jdk.disabled.namedCurves
方法2: 增加额外的java.security文件,配置jdk.tls.disabledAlgorithms选项,不包含TLSv1, TLSv1.1:
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA,
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL,
include jdk.disabled.namedCurves
运行JAR包时使用命令行:
-Djava.security.properties=
URL是额外的java.security文件的绝对路径,用以覆盖java.security文件中jdk.tls.disabledAlgorithms的值。
方法3: 降低JDK版本。
作者采取的是方法3,即降低JDK版本。因为使用Podman部署java应用,JDK是在Podmanfile中指定的:
FROM openjdk:8
镜像中默认安装openjdk-8u342,即JDK_VERSION=1.8.0_342,这个版本的JDK禁用了TLSv1:
Podmanfile修改为:
FROM openjdk:8u212-jre
JDK版本降低为1.8.0_212。
Podman重新打镜像再部署就OK了。
注意: 有些低版本JDK可能没有对应的docker镜像,所以这里采用了8u212-jre。