概述
公司某个服务要连接 SqlServer 数据库,本地运行一切正常,打包成 docker 镜像后,镜像启动失败
异常信息如下:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "The server selected protocol version TLS10 is not accepted by client preferences [TLS12]". ClientConnectionId:9b44ff23-25ac-4da3-8c9f-89cf55e46044
环境
Docker Java 基础镜像: openjdk:8-jdk
JDK 版本:openjdk version "1.8.0_342"
原因分析
从2021年4月20日开始,OpenJDK的季度更新版本默认禁用所有版本的TLS1.0和TLS1.1
而我们SqlServer版本较老,采用的凑巧是TLS1.0
解决方案
重新启用 TLS1.0 and TLS1.1
java.security 文件位于 JDK 安装目录下,例如:/Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/Home/jre/lib/security
1)确保 java.security 文件中的 security.overridePropertiesFile 值设置为 true(这通常是默认值)。
2)创建一个文件:enableLegacyTLS.security,并写入如下内容:
jdk.tls.disabledAlgorithms=jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA,DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves
主要是去掉了 TLSv1 and/or TLSv1.1
3)Dockerfile 配置文件中,增加 -Djava.security.properties=enableLegacyTLS.security 启动参数, 用于覆盖原有配置
Dockerfile示例:
FROM openjdk:8-jdk
ENV TZ Asia/Shanghai
VOLUME /tmp
ADD ./target/xxx.jar xxx.jar
ADD ./enableLegacyTLS.security enableLegacyTLS.security
EXPOSE 9005
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Djava.security.properties=enableLegacyTLS.security","-XX:MaxRAMPercentage=75.0","-jar","api-pack.jar"]