SQL Server驱动和TLS版本不兼容的原因分析和解决方案
作者:Dream_sky分享
这篇文章主要介绍了在将Java程序部署到Docker容器时,由于SQL Server和OpenJDK 8之间的TLS/SSL版本不兼容问题导致的错误,通过修改`java.security`文件放宽TLS/SSL的安全限制,解决了本地服务器和Docker容器的兼容性问题,需要的朋友可以参考下
一、问题描述
声明:java程序是docker容器化部署的 进行期初数据定时同步功能,sql server同步至mysql中,本地调用正常,发到服务器环境就会报错如下

- java.security path: /usr/local/openjdk-8/jre/lib/security Security providers: [SUN version 1.8, SunRsaSign version 1.8, SunEC version 1.8, SunJSSE version 1.8, SunJCE vers1on 1.8, SunJGSS version 1.8, SunSASL version 1.8, ) XMLDSig version 1.8, SunPCSC version 1.8] SSLContext provider info: Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories, SSLv3/TLSv1/TLSvl.1/TLSvl.2/TLSvl.3) SSLContext provider services:
配置文件如下:
# 动态数据源配置
datasource:
dynamic:
primary: master
datasource:
slave:
url: jdbc:sqlserver://192.168.0.1:1433;DatabaseName=test
username: root
password: xxxxxxx
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
<!-- sqlserver驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
二、原因分析:
这是一个Java安全配置相关的信息输出,通常是在启动应用或检查SSL配置时出现的。
通过异常信息可以看出
- Java安全文件路径:
/usr/local/openjdk-8/jre/lib/security - Java版本:
OpenJDK 8 - 显示TLS/SSL支持的协议版本:
SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3
检测到当前数据库使用的协商使用的是 TLSv1 协议,而项目中使用的时jdk8,它的协议版本高,不兼容 TLSv1 协议。
不能改其他项目的数据库的版本,则更改jdk安全配置文件java.security。
三、解决方案
3.1 服务器本地解决方案
修改java.security文件
放宽TLS/SSL的安全限制,解决某些老系统或内部系统连接时的兼容性问题
# 移除了 TLSv1, TLSv1.1 的禁用

修改前
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
修改后(放宽策略):
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA,\ DH keySize < 1024, EC keySize < 224, anon, NULL, ECDH
3.2 Docker容器部署解决方案
因为每次Jenkins部署,都会根据Dockerfile生成新的镜像和启动容器,修改需要修改容器内的安全文件,不可能每次发版都改所以修改Dockerfile文件
FROM openjdk:8-jdk
ADD app/target/app.jar /app/app.jar
RUN sed -i 's/^jdk.tls.disabledAlgorithms=.*/jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, anon, NULL, ECDH/' /usr/local/openjdk-8/jre/lib/security/java.security
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV JAVA_OPTS=""
ENV JAVA_ACTIVE=""
ENTRYPOINT exec java ${JAVA_OPTS} -jar ${JAVA_ACTIVE} /app/jb-access-server-business.jar
EXPOSE 35010
最主要就是RUN sed这行
sed: 流编辑器,用于文本处理-i: 直接修改原文件
's/^jdk.tls.disabledAlgorithms=.*/新的值/'
s/原内容/新内容/: 替换命令
^jdk.tls.disabledAlgorithms=.*: 匹配以"jdk.tls.disabledAlgorithms="开头的整行
到此这篇关于SQL Server驱动和TLS版本不兼容的原因分析和解决方案的文章就介绍到这了,更多相关SQL Server驱动和TLS版本不兼容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
