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

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

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


2022年更新-这个答案(正如评论所指出的)提供了一个解释和弥补差距,但也提供了一些更好的建议,包括购买和安装一个适当的证书(感谢大量的社区编辑)。

请参阅本线程中其他高投票的答案,包括下面来自Jitbit的@Alex关于从System.Data.Sql迁移到Microsoft.Data.Sql时的破坏性更改(剧透:加密现在默认设置为true)。

最初的回答:

您的SQL VM的可信根存储中可能没有安装CA签名证书。

如果你在连接字符串中有Encrypt=True,要么将其设置为关闭(不推荐),要么在连接字符串中添加以下内容(也不推荐):

TrustServerCertificate=True

如果您不安装自签名证书供SQL Server使用,则SQL Server将创建一个自签名证书,但调用者不会信任它,因为它不是ca签名的,除非您默认告诉连接字符串信任任何服务器证书。

从长期来看,我建议利用Let’s Encrypt从已知的受信任CA免费获得CA签名证书,并将其安装在VM上。不要忘记将其设置为自动刷新。你可以在“加密层次结构”和“使用未经验证的加密”的主题下在线阅读SQL Server书籍中关于这个主题的更多信息。


如果您试图通过Visual Studio 2015中的数据连接访问它,并得到上述错误,那么转到高级并设置 TrustServerCertificate = True 让错误消失。


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


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


如果你正在使用SQL Management Studio,请转到连接属性,然后点击“信任服务器认证”


我在试图运行剖析器时遇到了这个错误,即使我的连接已经检查了信任服务器证书,并且我在高级部分添加了TrustServerCertificate=True。我改为以管理员身份运行SSMS实例,分析器启动时没有问题。(我以前发现,即使是本地连接也需要很长时间才能连接,以管理员身份运行也会有所帮助)。


我在通过SSMS将Excel数据导入SQLDatabase时遇到了这个问题。解决方案是在安全部分设置TrustServerCertificate = True


从IIS访问SQLServer时遇到同样的问题。添加TrustServerCertificate=True没有帮助。

可以在MS文档中看到一条注释:确保SQLServer服务帐户可以访问您正在使用的TLS证书。(NT服务\ MSSQLSERVER)

打开个人存储,右键单击证书->管理私钥->添加SQL服务帐户并给予完全控制。

重新启动SQL服务。它工作。


虽然一般答案本身是正确的,但我发现它还不足以解决我的SQL Server导入和导出向导的问题。假设你有一个有效的(自动的)基于Windows安全的登录:

ConnectionString

Data Source=localhost; 
Initial Catalog=<YOUR DATABASE HERE>; 
Integrated Security=True; 
Encrypt=True; 
TrustServerCertificate=True; 
User Instance=False

这可以是完整的ConnectionString(都在一行上),也可以将这些值单独应用到它们的字段。


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

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


对于那些不喜欢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仍有抱怨问题。这样我就可以在没有信托的情况下加密连接…复选框选中)


当我试图连接到托管在谷歌云平台上的MS SQL Server实例时,在连接属性选项卡下使用SSMS未选中信任服务器证书时,我得到了相同的错误。通过将GCP提供的证书授权导入到本地计算机的“受信任的根证书颁发机构”列表,我成功信任了该证书。

在这里阅读完整的描述和解决方案。


在我的情况下,数据库是坏的。当我重新创建一个新的数据库名称时,错误得到解决。这是来自SQL Server数据库的错误。尝试重新创建一个新的数据库。


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


如果在ODBC设置(32或64)中已经创建了到服务器的ODBC连接(使用ODBC Driver 18 for SQL server),则需要配置该连接,并按3次“Next”。在最后一个屏幕中,中间有一个“信任服务器证书”复选框。设置为勾选。这样就行了。添加“TrustServerCertificate=True”到连接字符串,正如在其他答案中建议的那样,对我不起作用。


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

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

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

连接字符串属性


在把一个项目从。net 5迁移到。net 6之后,我也遇到了同样的问题。我尝试了建议的解决方案(TrustServerCertificate=True或Encrypt=False),它们按预期工作,但我有一个限制,不能更改连接字符串。因此,如果是这种情况,您仍然可以使用System.Data.SqlClient作为nuget包。就像这里解释的那样,它仍然被维护,但所有新的东西都将进入Microsoft.Data.SqlClient。


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

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

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


"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-O5SR0H0\\SQLEXPRESS;Database=myDataBase;Trusted_Connection=True;TrustServerCertificate=True;"
  }
}

我添加了这2行到ConnectionString和它工作

Trusted_Connection=True
TrustServerCertificate=True

短的通知。如果您正在使用AWS RDS,您可以从truststore.pki.rds.amazonaws.com获得证书。有关特定链接的详细信息可以在本文档中找到:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html。

只需下载适当的证书并将其安装到您的主机上。


如果你使用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

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

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

- database就- verbose