连接Sql Server时报错:无法通过使用安全套接字层加密与 SQL Server 建立安全连接

前言:

项目之前在服务器上一直正常运行,今天突然报错,报错内容为:com.microsoft.sqlserver.jdbc.SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server 建立安全连接:错误:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。

由于数据库服务器是第三方提供的。考虑产生的原因可能是,Sql Server数据库更换版本或是配置调整导致的,所以提供了几种解决办法。

解决办法:

解决办法一

找到C:\Program Files\Java\jdk-1.8\jre\lib\security\java.security 这个文件,查询jdk.tls.disabledAlgorithms,如果有TLSv1、TLSv1.1、3DES_EDE_CBC,要删除后再保存,注意以管理员形式保存,在修改的时候要注意此时要把项目程序关闭

修改后:

解决办法二

在连接数据库时,在我们使用的url后面加上一个encrypt=false或者encrypt=true;trustServerCertificate=true

String dbURL="jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=false";
String dbURL="jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=true;trustServerCertificate=true";
参数
encrypt

如果在客户端和 SQL Server 之间启用传输层安全性 (TLS)(以前称为安全套接字层 (SSL))加密,则为 true 。 否则为 false

如果 encrypt 属性设置为 true,则在服务器已安装有证书的情况下,Microsoft JDBC Driver for SQL Server 将确保 SQL Server 对在客户端与服务器之间发送的所有数据使用 TLS 加密 。 默认值是 false秒。

JDBC 驱动程序在尝试建立 TLS 握手时,会检测运行它的 Java 虚拟机 (JVM)。

如果 encrypt 属性设置为 true,则 Microsoft JDBC Driver for SQL Server 将使用 JVM 的默认 JSSE 安全提供程序与 SQL Server 协商 TLS 加密 。 默认的安全提供程序可能不支持成功协商 TLS 加密所需的全部功能。 例如,默认安全提供程序可能不支持在 SQL Server TLS/SSL 证书中使用的 RSA 公钥的大小。 在这种情况下,默认的安全提供程序可能报错,此错误将导致 JDBC 驱动程序终止连接。 为了解决这一问题,请执行下列操作之一:

  • 使用具有较小 RSA 公钥的服务器证书配置 SQL Server

  • 在“<java-home>/lib/security/java.security”安全属性文件中将 JVM 配置为使用其他 JSSE 安全提供程序

  • 使用其他 JVM

如果未指定 encrypt 属性或将此属性设置为 false,驱动程序将不会强制 SQL Server 支持 TLS 加密 。 如果 SQL Server 实例未配置为强制使用 TLS 加密,则将在不进行任何加密的情况下建立连接。 如果将 SQL Server 实例配置为强制使用 TLS 加密,则在经正确配置的 JVM 上运行时,Microsoft JDBC Driver for SQL Server 将自动启用 TLS 加密,否则连接将终止并且驱动程序将报错。

trustServerCertificate

如果在使用 TLS 加密通信层时,应自动信任服务器传输层安全性 (TLS)(以前称为安全套接字层 (SSL))证书,则为 true 。 否则为 false

如果 trustServerCertificate 属性设置为 true,则在使用 TLS 加密通信层时,自动信任 SQL Server TLS/SSL 证书 。 换言之,Microsoft JDBC Driver for SQL Server 将不会验证 SQL Server TLS/SSL 证书。 默认值是 false秒。

如果将 trustServerCertificate 属性设置为 false,则 Microsoft JDBC Driver for SQL Server 将验证服务器 TLS/SSL 证书 。

解决办法三:

驱动程序版本不兼容,某些较旧版本的驱动程序可能不支持 TLS加密连接。为了允许应用程序使用 TLS 加密,从 1.2 版开始,Microsoft JDBC Driver for SQL Server 引入了以下连接属性:encrypt、trustServerCertificate、trustStore、trustStorePassword 和 hostNameInCertificate 。 为了使驱动程序能够将 TDS 8.0 与 TLS 加密配合使用,从版本 11.2 开始引入了连接属性 serverCertificate。

我本次更换的驱动包是:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.2.jre11</version>
</dependency>

总结

项目出现此类问题时,可能以上任何一种就可以解决问题,也可能多种情况都需要调整才能解决问题,需要根据自身的实际情况进行调整。

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值