“证书链是由一个不可信的权威机构颁发的”;在Azure网站的VM Role中连接DB时

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

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

我能够使用SSMS连接到我的DB。虚拟机角色的1433端口是开放的。 我的连接有什么问题?< / p >

515241 次浏览

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

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

最初的回答:

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

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

TrustServerCertificate=True

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

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

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

.

.

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

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

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

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

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

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

可以在MS docs中看到注释:确保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

4.0的突破性变化

Encrypt连接字符串属性默认更改为true

Encrypt连接设置的默认值已从false更改为true。随着云数据库的使用越来越多,并且需要确保这些连接的安全性,是时候进行这种打破向后兼容性的改变了。

当需要加密时,确保连接失败

在客户端加密库被禁用或不可用的情况下,当Encrypt被设置为true或服务器需要加密时,可以建立未加密的连接。

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

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

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

SQL Server:

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

客户端:

  • 使用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"在其他答案中建议的连接字符串不适合我。

ODBC Data Sources (32 or 64) < / >

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

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

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

连接字符串属性 . rref ="https://learn.microsoft.com/en-us/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client?view=sql-server-ver15" rel="nofollow noreferrer

在把一个项目从。net 5迁移到。net 6之后,我也遇到了同样的问题。我已经尝试了建议的解决方案(TrustServerCertificate=TrueEncrypt=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