- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先请注意,我知道这个问题已经被问过好几次了。然而,到目前为止给出的已接受(和未接受)的解决方案不在我的案例中起作用,所以从那时起一定发生了一些实质性的变化,希望有理由再次提问。
话虽如此:
我目前正在尝试将 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=true
或 Trusted_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/
副标题 - 我如何在没有中间人攻击的情况下真正安全地连接到 SQL Azure? 我可以使用 TrustServerCertificate=true 的 ADO.net 连接字符串并成功连接到服务器。
副标题 - 我如何在没有中间人攻击的情况下真正安全地连接到 SQL Azure? 我可以使用 TrustServerCertificate=true 的 ADO.net 连接字符串并成功连接到服务器。
首先请注意,我知道这个问题已经被问过好几次了。然而,到目前为止给出的已接受(和未接受)的解决方案不在我的案例中起作用,所以从那时起一定发生了一些实质性的变化,希望有理由再次提问。 话虽如此: 我目前正
我是一名优秀的程序员,十分优秀!