从 Azure 网站连接 VM 角色(我有 SQL VM 角色)中的我的数据库时遇到错误。VM Role 和 Azure 网站都在 West zone。我面临以下问题:
SqlException (0x80131904): 与服务器建立连接成功,但在登录过程中出现错误。(提供者:SSL 提供者,错误:0 - 证书链是由不受信任的机构颁发的。)]
我可以使用 SSMS 连接到我的数据库。1433 端口在我的 VM 角色上打开。我的连接有什么问题?
从 Azure 网站连接 VM 角色(我有 SQL VM 角色)中的我的数据库时遇到错误。VM Role 和 Azure 网站都在 West zone。我面临以下问题:
SqlException (0x80131904): 与服务器建立连接成功,但在登录过程中出现错误。(提供者:SSL 提供者,错误:0 - 证书链是由不受信任的机构颁发的。)]
我可以使用 SSMS 连接到我的数据库。1433 端口在我的 VM 角色上打开。我的连接有什么问题?
您可能没有在 SQL VM 的受信任根存储中安装 CA 签名证书。
如果您Encrypt=True
在连接字符串中,请将其设置为关闭(不推荐),或在连接字符串中添加以下内容:
TrustServerCertificate=True
如果您不安装一个自签名证书以供 SQL Server 使用,SQL Server 将创建一个自签名证书,但调用者不会信任它,因为它不是 CA 签名的,除非您通过以下方式告诉连接字符串信任任何服务器证书默认。
从长远来看,我建议利用Let's Encrypt从已知的受信任 CA 免费获取 CA 签名证书,并将其安装在 VM 上。不要忘记将其设置为自动刷新。您可以在 SQL Server 在线书籍的“加密层次结构”和“使用无验证的加密”主题下阅读有关此主题的更多信息。
如果您在尝试使用 SSMS 连接时看到此错误消息,请添加TrustServerCertificate=True
到附加连接参数。
我决定添加另一个答案,因为此帖子作为此错误的第一个 Google 结果弹出。
如果您在 2022 年 1 月之后收到此错误,可能是在从 4.0.0 或更高版本迁移System.Data.SqlClient
或Microsoft.Data.SqlClient
刚刚更新Microsoft.Data.SqlClient
到 4.0.0 或更高版本之后,这是因为 MS 引入了一项重大更改::
4.0 中的重大变化
Encrypt
将连接字符串属性更改为true
默认值。连接设置的默认值
Encrypt
已从 更改false
为true
。随着云数据库的使用越来越多,并且需要确保这些连接是安全的,是时候进行这种向后兼容的破坏性更改了。确保在需要加密时连接失败
在客户端加密库被禁用或不可用的情况下,当
Encrypt
设置为true
或服务器需要加密时,可能会建立未加密的连接。
Rick Strahl在他的博客上发布了详细的解释
更改是在2021 年 8 月在此 SqlClient 拉取请求中进行的,其中有关于更改的额外讨论。
快速修复是添加Encrypt=False
到您的连接字符串。
如果您尝试通过 Visual Studio 2015 中的数据连接访问它,并收到上述错误,请转到高级并设置
TrustServerCertificate=True
错误消失。
虽然一般答案本身是正确的,但我发现它对于我的面向 SQL Server 导入和导出向导的问题还远远不够。假设您有一个有效的(和自动的)基于 Windows 安全的登录:
连接字符串
Data Source=localhost;
Initial Catalog=<YOUR DATABASE HERE>;
Integrated Security=True;
Encrypt=True;
TrustServerCertificate=True;
User Instance=False
这可以是您的完整ConnectionString(全部在一行上),或者您可以将这些值单独应用于它们的字段。
我在通过 SSMS 将 Excel 数据导入 SQLDatabase 时遇到了这个问题。解决方案是TrustServerCertificate = True
在安全部分设置
从 IIS 访问 SQLServer 时遇到了同样的问题。添加 TrustServerCertificate=True 没有帮助。
可以在 MS 文档中看到评论:确保 SQLServer 服务帐户有权访问您正在使用的 TLS 证书。(NT 服务\MSSQLSERVER)
打开个人商店并右键单击证书 -> 管理私钥 -> 添加 SQL 服务帐户并给予完全控制。
重新启动 SQL 服务。有效。
我在尝试运行分析器时遇到了这个错误,即使我的连接已经检查了信任服务器证书并且我TrustServerCertificate=True
在高级部分添加了。我更改为以管理员身份运行的 SSMS 实例,并且探查器启动时没有问题。(我以前发现,当我的连接甚至到本地需要很长时间才能连接时,以管理员身份运行会有所帮助)。
对于那些不喜欢TrustServerCertificate=True
答案的人,如果您有足够的访问权限,您可以导出 SQL Server 证书并安装在您尝试连接的位置。这可能不适用于 SQL Server 自行生成的证书,但如果您使用New-SelfSignedCertificate 之类的东西,您可以使用 MMC 导出证书,然后在客户端上使用 MMC 导入它。
在 SQL Server 上:
在客户端:
(我在同一台服务器上做所有事情,但在我重新启动 SQL 实例之前,仍然存在 SSMS 抱怨问题。然后我可以在不选中 Trust... 复选框的情况下进行加密连接)
同样可以从 ssms 客户端本身实现。只需打开 ssms,插入服务器名称,然后从标题连接属性下的选项中确保选中信任服务器证书。
尝试使用 SSMS 在连接属性选项卡下使用未选中的信任服务器证书连接到托管在 Google Cloud Platform 上的 MS SQL Server 实例时,我遇到了同样的错误。我设法通过将 GCP 提供的证书权限导入本地计算机的受信任的根证书颁发机构列表来信任证书。
在此处阅读完整说明和解决方案。
就我而言,数据库很糟糕。当我重新创建一个新的数据库名称时,错误得到了解决。这是来自 SQL Server 数据库的错误。尝试重新创建一个新数据库。