我在从Azure网站连接我的DB时遇到了一个错误,它是在虚拟机角色(我有SQL虚拟机角色)。VM Role和Azure Website都在West zone。我面临着以下问题:
SqlException (0x80131904):成功建立了与服务器的连接,但是在登录过程中发生了错误。(提供者:SSL提供者,错误:0 -证书链是由一个不受信任的机构颁发的。)]
我可以使用SSMS连接到我的DB。虚拟机角色的1433端口是开放的。 我的连接有什么问题?
我在从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书籍中关于这个主题的更多信息。
其他回答
我决定添加另一个答案,因为这篇文章会作为这个错误的第一个谷歌结果弹出。
如果你在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。
当我试图连接到托管在谷歌云平台上的MS SQL Server实例时,在连接属性选项卡下使用SSMS未选中信任服务器证书时,我得到了相同的错误。通过将GCP提供的证书授权导入到本地计算机的“受信任的根证书颁发机构”列表,我成功信任了该证书。
在这里阅读完整的描述和解决方案。
我在通过SSMS将Excel数据导入SQLDatabase时遇到了这个问题。解决方案是在安全部分设置TrustServerCertificate = True
对于那些不喜欢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仍有抱怨问题。这样我就可以在没有信托的情况下加密连接…复选框选中)
如果你使用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