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

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

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


当前回答

对于那些不喜欢TrustServerCertificate=True答案的人,如果你有足够的访问权限,你可以导出SQL Server证书并在你试图连接的地方安装。这可能不适用于SQL Server自己生成的证书,但如果您使用类似New-SelfSignedCertificate的东西,则可以使用MMC导出证书,然后在客户端上使用MMC导入证书。

SQL Server:

在MMC中添加证书管理单元 浏览到证书>个人>证书 选择新证书,右键单击,然后选择All Tasks > Manage Private Keys(这一步和下面的步骤是使密钥与SQL server一起工作的一部分) 添加具有READ权限的运行SQL Server的标识(如果有疑问,请在Services中查找标识)。 选择新证书,右键单击,选择“All Tasks > Export…” 使用默认设置并另存为文件。

客户端:

使用MMS与相同的管理单元选项和证书>受信任的根证书颁发机构右键单击证书并选择所有任务>导入… 导入之前导出的文件

(我在同一台服务器上做所有事情,直到我重新启动SQL实例,SSMS仍有抱怨问题。这样我就可以在没有信托的情况下加密连接…复选框选中)

其他回答

将Encrypt=False添加到连接字符串,就是这样

如果您正在使用答案中提到的任何连接属性,如果true/false似乎不起作用,则接受的值为yes/no。

TrustServerCertificate -接受字符串“yes”和“no”作为值。默认值为“no”,表示验证服务器证书。

使用ODBC 18.0 -希望它有帮助。

连接字符串属性

我在实体框架迁移中得到了这个消息。我能够与Win Auth连接到Sql Server,并手动创建表。但EF行不通。这个连接字符串终于工作了

Server=MyServerName;Database=MyDbName;Trusted_Connection=SSPI;Encrypt=false;TrustServerCertificate=true

在我的例子中,扩展连接字符串是不够的 加密= false; TrustServerCertificate = true;

我仍然需要在NuGet控制台输入:

- database就- verbose

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

如果你在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。