错误提示:errorCode 0, state 08S01

出现原因:在连接低版本sql server 提示这个错误,数据库服务器只支持 TLS 1.0,而 Java 客户端默认禁用了它。在 Java 8u292 及以上版本中,为了提高安全性,JRE 默认在 jdk.tls.disabledAlgorithms 配置项中主动禁用了 TLS 1.0 和 TLS 1.1 协议。而较老版本的 SQL Server(如 2008、2012、2014 版本)在进行加密登录时,首选协议往往是 TLS 1.0。当双方协议版本无法达成一致时,SQL Server 便会主动断开连接(Connection Reset),JDBC 驱动随即抛出 08S01 错误。

1.IDEA中JVM参数-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2无法解决该问题,原因从 JDK 8u292 / JDK 11.0.11 开始,受安全合规要求驱动,底层 java.security 策略的优先级高于 jdk.tls.client.protocols 动态参数,即使配置了后者,TLSv1 仍会被强制拦截。

2.修改 JDK 安全策略文件(根治)

此方案会永久修改 JDK 的安全策略,允许所有基于该 JDK 的应用使用 TLS 1.0。

  1. 找到 java.security 文件

    • Java 8$JAVA_HOME/jre/lib/security/java.security

    • Java 11 及以上$JAVA_HOME/conf/security/java.security

找到这串代码,把 TLSv1, TLSv1.1删除,关闭所有的java进程,重新启动。

#jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, DTLSv1.0, RC4, DES, \
jdk.tls.disabledAlgorithms=SSLv3, DTLSv1.0, RC4, DES, \
    MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, ECDH, \
    include jdk.disabled.namedCurves

更多推荐