gpt4 book ai didi

sql-server - 尽管连接字符串中有 TrustServerCertificate=true,但 SSL/证书验证错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:17 53 4
gpt4 key购买 nike

首先请注意,我知道这个问题已经被问过好几次了。然而,到目前为止给出的已接受(和未接受)的解决方案在我的案例中起作用,所以从那时起一定发生了一些实质性的变化,希望有理由再次提问。

话虽如此:

我目前正在尝试将 Access 2010 .adp 应用程序升级到 Access 2019 .accdb。该应用程序包含大量的VBA代码,这些代码使用ADO对象连接并运行于Microsoft SQL Server(目前:2008 R2,但即将升级)。

我想保留大部分代码,这意味着坚持使用 ADO,所以要走的路是新的 OleDB SQL 服务器驱动程序(未弃用/2018 年新发布)。 SQL 服务器在我的客户端应用程序之外的另一台机器上运行。

我无法从 VBA 建立到 SQL Server 的连接。当执行下面的代码片段时

Dim cnTemp As Connection
Set cnTemp = New Connection
cnTemp.CursorLocation = adUseServer
cntemp.Open "Provider=MSOLEDBSQL;Server=dbserver.example.com;Initial Catalog=MyDB;Authentication=SqlPassword;User ID=sa;Password=secret;DataTypeCompatibility=80;"

执行最后一行时出现以下错误:

SSL Provider: The certificate chain was issued by an authority which is not trusted.

好的,没问题,毕竟我们已经找到了处理同一问题的所有其他问题,都提出了相同的解决方案:添加 Trust Server Certificate=True;到连接字符串。

好吧,试过了,但令我惊讶的是,情况还是一样。然后我尝试了一些其他变体,如 TrustServerCertificate=True;或使用 true而不是 True ,但无济于事。我也尝试添加 Use Encryption for Data=True;这也没有帮助(这是可以预料的)。此外,我尝试了一些在研究问题时发现的片段,但 Microsoft 未将其记录为在 ADO 连接字符串中有效(如 Encrypt=trueTrusted_Connection=true; );当然,这会使情况变得更糟,并引发其他错误消息。

我明白我可以通过将 SQL Server 证书放入客户端的受信任根证书存储区或让 SQL Server 使用由已知的受信任 CA(例如 Let's Encrypt)颁发的证书来解决该问题。

但是,我非常想知道为什么要添加 Trust Server Certificate=true;到我的连接字符串不会使错误消失以及我必须在其中放置什么来禁用证书验证(顺便说一句,如果我们不开始讨论为什么这会很糟糕,我将不胜感激;这是仅在受信任的封闭网络中进行开发和测试,我知道可能存在的风险)。

最佳答案

连接字符串中的 TrustServerCertificate=True 不被接受的原因有两个。一是它不是有效的 ADO 经典 (ADODB) 连接字符串关键字。根据ActiveX Data Objects (ADO) Connection String Keywords documentation ,关键字/值对应该是 Trust Server Certificate=True(注意空格)。关键字在没有空格的情况下被完全忽略,因此不被信任。

但是,由于 Authentication-SqlPassword 规范,仅此更改不会信任证书。当指定 Authentication 关键字时,文档脚注会调用:

To improve security, encryption and certificate validation behavior is modified when using Authentication/Access Token initialization properties or their corresponding connection string keywords. For details, see Encryption and certificate validation link.

引用的链接包含此重要说明:

Certificate validation can also be controlled through the Value field of the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI18.0\GeneralFlags\Flag2 registry entry. Valid values are 0 or 1. The OLE DB driver chooses the most secure option between the registry and the connection property/keyword settings. That is, the driver will validate the server certificate as long as at least one of the registry/connection settings enables server certificate validation.

因此,即使使用 Trust Server Certificate=True,当此注册表值设置为 0 时,证书也会被验证。

一种解决方案是简单地删除 Authentication=SqlPassword 规范,只要您不需要通过不信任服务器证书来提高安全性:

cntemp.Open "Provider=MSOLEDBSQL;Server=dbserver.example.com;Initial Catalog=MyDB;User ID=sa;Password=secret;Trust Server Certificate=True;DataTypeCompatibility=80;"

关于sql-server - 尽管连接字符串中有 TrustServerCertificate=true,但 SSL/证书验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150324/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com