A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。)

发布时间 2023-06-21 17:02:54作者: Core、陈

  昨天搞了个测试接口,用postman请求测试,Https的协议,然后请求发出去,既没有报错,也没有返回数据库的数据,code倒是0,不是 100,那程序也没有报错,这就奇怪了,我就先监测数据库,发现请求并没有过来,我傻眼了,一些简单的代码还能出错吗?然后开后端调试,就发现了上面的这个提示,在请求的时候被拦截了,相当于没有请求数据库,原路返回

  查找一些资料发现可以在appsettings配置文件连接数据库的配置后面加上 TrustServerCertificate=true 这个,我就试了一下,果然可以(注意有分号隔开)

 那篇文章并没有说是什么原因,那我就去找一下原因,微软的文档里面是这么说的:

当连接到 SQL Server 时,如果应用程序请求加密并且 SQL Server 的实例已配置为支持 TLS 加密,则 Microsoft JDBC Driver for SQL Server 将启动 TLS 握手。 握手允许服务器和客户端协商将用于保护数据的加密方式和加密算法。 在完成 TLS 握手之后,客户端和服务器可以安全地发送已加密的数据。 在 TLS 握手期间,服务器向客户端发送其公钥证书。 公钥证书的颁发者称为证书颁发机构 (CA)。 客户端负责验证证书颁发机构是否为客户端信任的证书颁发机构。

如果应用程序未请求加密,则 Microsoft JDBC Driver for SQL Server 将不强制 SQL Server 支持 TLS 加密。 如果 SQL Server 实例未配置为强制 TLS 加密,将建立连接而不进行加密。 如果 SQL Server 实例已配置为强制 TLS 加密,则当驱动程序在经正确配置的 Java 虚拟机 (JVM) 上运行时,它将自动启用 TLS 加密,否则连接将终止并且驱动程序将报错。

 

那么通过文档就可以知道  TrustServerCertificate=true —如果 trustServerCertificate 属性设置为“true”,驱动程序将不验证 TLS 证书。

相反 TrustServerCertificate=false —服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。

因为我们的https证书是自签发,所以在验证的时候不通过,只有设置不验证或者不去强制要求服务器支持加密就不会出现这个错误,可以成功请求通数据库的,那么下面这个参数也可以避免这个错误,二选一即可

encrypt = false—驱动程序不会强制服务器支持 TLS 加密