一个月前为一个老项目升级了 JDK 版本,现在整个环境都使用 Docker 镜像启动,Web 服务一切正常,测试也验收通过了。
最近运维同学找过来说有一批新数据没有同步过来,查询了表数据和日志基本判定是定时任务的问题,找过找到日志定位发现错误,具体是定时任务在连接 SQLServer 服务器时出错:
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
目录:
$ 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
,修改完如下:
...
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
在本地存储一份,修改完成后通过挂载的方式放进容器中,配置如下:
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
重启容器生效。