记录jdk21连接SQLServer因为TLS协议报错问题
作者:照猫画狐
在使用Druid连接池连接SQL Server时,可能会遇到因TLS版本不匹配导致的连接失败问题,具体表现为客户端使用TLS1.3或TLS1.2,而SQL Server仅支持TLS1.0,导致无法建立安全连接,解决方法是修改JDK的安全配置,启用TLS1.0
报错信息
com.alibaba.druid.pool.DruidDataSource - create connection SQLException, url: jdbc:sqlserver://192.168.60.93;databaseName=THIS4, errorCode 0, state 08S01 com.microsoft.sqlserver.jdbc.SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server 建立安全连接:错误:The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]。
解决方案
从报错信息上来看,是因为客户端使用的协议版本是TLS1.3和TLS1.2,与服务器支持的版本TLS1.0不匹配导致握手失败。
百度上查阅得知从JDK8开始,默认使用的TLS版本是TLS 1.2,JDK17默认使用的TLS版本是TLS 1.3,但是JDK17已经在默认的安全配置中,把TLS1.0和TLS1.1禁用掉了。
以下是启用TLS1.0的操作方法,操作完需要重启服务:
#jdk11+ 配置文件位置 #例:C:\Program Files\Java\jdk-21\conf\security\java.security $JAVA_HOME/conf/security/java.security # jdk8及以下 配置文件位置 #例:C:\Program Files\Java\jre1.8.0_421\lib\security\java.security $JRE_HOME/lib/security/java.security #找到里面的一行配置: jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL #说明:JDK中的jdk.tls.disabledAlgorithms参数用于禁用不安全或不需要的TLS密码算法, #以提高系统的安全性。通过配置这个参数,可以指定JDK不支持的密码算法或协议,以降低它们的优先级, #减少被攻击的风险。 #我们把TLSv1,TLSv1.1这两个删除掉,变成如下: jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。