升级Java17后Liquibase连接SQL Server出现TLS协议不匹配报错如何解决?
你使用的Microsoft SQL Server 2012 Express(版本号11.0.2100.60对应SQL Server 2012)默认仅启用TLS 1.0协议,而Java 17默认安全配置禁用了TLS 1.0、TLS 1.1,仅允许TLS 1.2、TLS 1.3,同时9.x以上版本的mssql-jdbc驱动默认强制加密连接,因此触发协议不匹配的报错。
方案1:服务端启用TLS 1.2(推荐,无安全风险)
SQL Server 2012本身支持TLS 1.2,手动开启即可永久解决问题:
- 先安装SQL Server 2012 Service Pack 4及以上补丁,确保服务端已支持TLS 1.2
- 打开Windows注册表编辑器,定位到路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols - 新建名为
TLS 1.2的项,在该项下再新建Client、Server两个子项 - 在
Server子项中新建两个DWORD值:- 名称为
DisabledByDefault,值设置为0 - 名称为
Enabled,值设置为1
- 名称为
- 在
Client子项中新建和上面完全相同的两个DWORD值,配置保持一致 - 重启操作系统,重启SQL Server服务后配置生效
方案2:修改JDBC连接参数(仅本地开发环境使用,存在安全风险)
如果是本地开发不想修改服务端配置,可以直接修改Liquibase的JDBC连接URL,添加参数跳过加密校验和TLS版本限制:
原URL:
jdbc:sqlserver://localhost:1433;databaseName=My_Database;integratedSecurity=true
修改后URL:jdbc:sqlserver://localhost:1433;databaseName=My_Database;integratedSecurity=true;encrypt=false;trustServerCertificate=true
如果仍报错,可额外添加tlsVersions=TLSv1.0参数强制使用TLS 1.0协议,完整URL如下:jdbc:sqlserver://localhost:1433;databaseName=My_Database;integratedSecurity=true;encrypt=false;trustServerCertificate=true;tlsVersions=TLSv1.0
方案3:修改Java 17安全配置(不推荐)
也可以通过修改JDK默认安全规则放开TLS 1.0限制:
- 找到Java 17安装目录下的
conf/security/java.security文件 - 搜索
jdk.tls.disabledAlgorithms配置项,删除配置值中的TLSv1、TLSv1.1条目 - 保存文件后重启IDE、Maven进程即可生效
内容的提问来源于stack exchange,提问作者victorio

