项目场景:
在使用Docker进行构建Java镜像后并运行容器,以下是Dockerfile文件
FROM openjdk:8-jdk
WORKDIR /app
RUN apt-get update && apt-get install -y curl wget
CMD ["java", "-jar", "app_Object-1.0-SNAPSHOT.jar"]
问题描述
在运行容器后查看日志发现以下报错:
The server selected protocol version TLS10 is not accepted by client preferences [TLS12]
原因分析:
SqlServer
服务器只接受 TLS1.0
,在进入容器后查询jre内的java.security文件找到jdk.tls.disabledAlgorithms
配置发现新版的 JDK 不推荐使用旧的 TLSV1.0 的协议,而Springboot JDK1.8使用的是 TLS1.2
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
解决方案:
提示:那么根据思路,我们需要让springboot使用TLS1.0 就可以使用了。
在java.security配置文件中将LSv1, TLSv1.1, 3DES_EDE_CBC 删除,就可以使用TLS1.0 了。
如果我们在容器内直接删除 LSv1, TLSv1.1, 3DES_EDE_CBC 然后重启的话,问题依然不能得到解决。
正确做法:
在通过Dockerfile构建镜像的时候直接将java.security配置中 LSv1, TLSv1.1, 3DES_EDE_CBC配置删除。
修改后的Dockerfile,将/usr/local/openjdk-8/jre/lib/security/java.security
替换为自己真实路径
FROM openjdk:8-jdk
WORKDIR /app
RUN apt-get update && apt-get install -y curl wget
#删除java.security文件中的TLSv1, TLSv1.1,3DES_EDE_CBC
RUN sed -i -e '703,+2s/TLSv1,//' -e '703,+2s/TLSv1.1,//' -e '704,+2s/3DES_EDE_CBC,//' /usr/local/openjdk-8/jre/lib/security/java.security
CMD ["java", "-jar", "app_Object-1.0-SNAPSHOT.jar"]
❀❀❀重新发布后测试,问题解决❀❀❀
拓展
如果Springboot项目使用的是mssql-jdbc >> 8.4.*.jre8
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.*.jre8</version>
</dependency>
在运行项目时会出现下面警告:
TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum.
结局这个非常简单,只需要把mssql-jdbc版本降到8.2.*.jre8即可消除告警
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.2.*.jre8</version>
</dependency>