前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 8 默认禁用 TLSv1 导致 SQLServer 连接失败

Java 8 默认禁用 TLSv1 导致 SQLServer 连接失败

原创
作者头像
Power
发布于 2025-04-03 08:17:20
发布于 2025-04-03 08:17:20
10100
代码可运行
举报
运行总次数:0
代码可运行

一个月前为一个老项目升级了 JDK 版本,现在整个环境都使用 Docker 镜像启动,Web 服务一切正常,测试也验收通过了。

最近运维同学找过来说有一批新数据没有同步过来,查询了表数据和日志基本判定是定时任务的问题,找过找到日志定位发现错误,具体是定时任务在连接 SQLServer 服务器时出错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

搜索发现是因为 Java 8 在新版本中将 TLSv1.0 和 TLSv1.1 禁用了,而项目中 SQLServer 驱动使用的正是 TLSv1。

首先找到 jre 目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ env | grep JAVA_HOME
JAVA_HOME=/opt/java/openjdk
$ cd /opt/java/openjdk/jre/lib/security/
$ vim java.security

编辑 java.security 文件,然后找到 jdk.tls.disabledAlgorithms 属性中删除 TLSv1 和 TLSv1.1,修改完如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
...

然后重启 Web 应用即可。不过我这里是通过容器启动的,我的做法是将 java.security 在本地存储一份,修改完成后通过挂载的方式放进容器中,配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3'
services:
  tomcat_task:
    image: tomcat:8.5.85-jdk8-temurin-jammy
    container_name: tomcat_task
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./java/conf/java.security:/opt/java/openjdk/jre/lib/security/java.security
      - ./tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml
      - ./tomcat/conf/web.xml:/usr/local/tomcat/conf/web.xml
      - ./tomcat/webapps:/usr/local/tomcat/webapps
      - ./tomcat/logs:/usr/local/tomcat/logs

重启容器生效。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档