我在从Azure网站连接我的DB时遇到了一个错误,它是在虚拟机角色(我有SQL虚拟机角色)。VM Role和Azure Website都在West zone。我面临着以下问题:

SqlException (0x80131904):成功建立了与服务器的连接,但是在登录过程中发生了错误。(提供者:SSL提供者,错误:0 -证书链是由一个不受信任的机构颁发的。)]

我可以使用SSMS连接到我的DB。虚拟机角色的1433端口是开放的。 我的连接有什么问题?


当前回答

我决定添加另一个答案,因为这篇文章会作为这个错误的第一个谷歌结果弹出。

如果你在2022年1月之后得到这个错误,可能是在从System.Data.SqlClient迁移到Microsoft.Data.SqlClient之后,或者只是将Microsoft.Data.SqlClient更新到4.0.0或更高版本之后,这是因为MS引入了一个破坏性的更改:

https://learn.microsoft.com/sql/connect/ado-net/introduction-microsoft-data-sqlclient-namespace?view=sql-server-ver15#breaking-changes-in-40

Breaking changes in 4.0 Changed Encrypt connection string property to be true by default. The default value of the Encrypt connection setting has been changed from false to true. With the growing use of cloud databases and the need to ensure those connections are secure, it's time for this backwards-compatibility-breaking change. Ensure connections fail when encryption is required In scenarios where client encryption libraries were disabled or unavailable, it was possible for unencrypted connections to be made when Encrypt was set to true or the server required encryption.

此更改是在2021年8月的SqlClient拉取请求中进行的,其中有关于此更改的额外讨论。

快速解决方法是在连接字符串中添加Encrypt=False。

其他回答

从ssms客户端本身也可以实现同样的功能。只需打开ssms,插入服务器名称,然后从标题连接属性下的选项确保信任服务器证书被选中。

如果你使用EF Core 7,微软官方文档中解释了一个突破性的变化 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/breaking-changes#encrypt-defaults-to-true-for-sql-server-connections

关闭连接字符串中的加密。你可以通过在你的连接字符串中添加以下内容来实现:

encrypt=false

如果尝试使用SSMS连接时看到此错误消息,请将TrustServerCertificate=True添加到附加连接参数中。

如果您使用Version 18并通过pyodbc访问,它是"TrustServerCertificate=yes",您需要添加到连接中