从Azure网站连接VM角色中的数据库时,"证书链由不受信任的权限颁发"

Zaf*_*afi 166 azure-web-roles azure-vm-role

从Azure网站连接虚拟机角色(我有SQL VM角色)的MY DB时遇到错误.VM Role和Azure Website都位于West区域.我正面临以下问题:

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

我可以使用SSMS连接到我的数据库.我的VM角色打开了1433端口.我的连接有什么问题?

Ale*_*lex 409

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

如果您在 2022 年 1 月之后收到此错误,可能是从版本 4.0.0 或更高版本迁移或刚刚更新到版本 4.0.0 或更高版本之后System.Data.SqlClientMicrosoft.Data.SqlClientMicrosoft.Data.SqlClient是因为 MS 引入了重大更改:

https://docs.microsoft.com/sql/connect/ado-net/introduction-microsoft-data-sqlclient-namespace?view=sql-server-ver15#writing-changes-in-40

4.0 中的重大变化

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

连接设置的默认值Encrypt已从 更改falsetrue。随着云数据库的使用不断增加以及确保这些连接安全的需要,是时候进行这种破坏向后兼容性的更改了。

确保需要加密时连接失败

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

该更改是在 2021 年 8 月的 SqlClient 拉取请求中进行的,其中有关于更改的其他讨论

快速修复方法是添加Encrypt=false到您的连接字符串中。

  • 使用 Entity Framework Core 7(当前处于预览版)时也会发生同样的情况,并且相同的修复工作完美。感谢分享 (23认同)
  • 解决方案(而不是快速修复)是从 Let's Encrypt 或私有 CA 获取真正的证书 (4认同)
  • 如果有人想知道如何解决此问题,请添加修改后的 ConnectionStrings 部分。"ConnectionStrings": { "DefaultConnection": "服务器=.;数据库=反应性;Trusted_Connection=True;加密=False" } (4认同)

Thi*_*lva 335

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

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

TrustServerCertificate=True
Run Code Online (Sandbox Code Playgroud)

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

从长远来看,我建议利用Let's Encrypt免费从已知的可信CA获取CA签名证书,并将其安装在VM上.不要忘记将其设置为自动刷新.您可以在"SQL加密层次结构"主题和"使用无验证加密"主题的SQL Server书籍中阅读有关此主题的更多信息.

HTH

  • 建议将`TrustServerCertificate`设置为`true`是不好的 - 这会禁用证书检查.这并不比仅将`Encrypt`设置为`false`更好! (5认同)
  • 抱歉,我的错,在连接字符串中设置了 TTrusted_Connection=False 。设置为 true 对我有用。无论如何,谢谢 (4认同)
  • 在这个答案中给出"TrustServerCertificate = True"的建议可能会使问题消失,但这是一个糟糕的建议.解决原因,而不是症状.答案的另一部分建议安装CA签名证书是要走的路. (4认同)
  • 我想指出的是,在某些情况下,我们绝对不关心“黑客是否可以拦截您的sql流量”,例如,您正在开发中,并且您连接到的服务器是localhost。 .. (4认同)
  • 在较新版本的 SSMS 中,您会在“连接属性”选项卡中找到一个名为“信任服务器证书”的小选项。检查这个男孩与上面列出的命令具有相同的效果。 (3认同)

T.S*_*.S. 59

我在实体框架迁移中收到此消息。我能够使用 Win Auth 连接到 Sql Server 并手动创建表。但是EF不行。这个连接字符串终于起作用了

Server=MyServerName;Database=MyDbName;Trusted_Connection=SSPI;Encrypt=false;TrustServerCertificate=true
Run Code Online (Sandbox Code Playgroud)

  • 我多次卸载、重新安装、修复、重新启动我的所有 SQL Server 实例。VS22 的 SQL Server 集成也是如此。SSMS 也是如此。什么都没起作用。从 PMC 复制并粘贴错误将我带到了这里。解决方案就在这些答案中。甚至 ChatGPT 也无法提供帮助(可能是因为这是最近的问题)。谢谢社区。 (2认同)

小智 53

如果您正在使用SQL Management Studio,请转到连接属性并单击 如果您正在使用SQL Management Studio,请转到连接属性并单击"Trust server certificated"

  • 这本身并不是一个糟糕的建议.我想说,当你需要连接到开发服务器并完成你的工作时,你可以使用它,比如编码.作为一名软件开发人员,我经常与DevOps斗争,他们没有时间快速解决问题,我不能浪费宝贵的时间来应对最后期限.关闭此选项的称重数据曝光取决于您的许多环境,如果它是本地或远程,管理员如何设置它,IP限制,并且可以通过其他解决方法轻松缓解.如果没有关于基础设施的一些信息,你不能说这是一个糟糕的建议. (14认同)

小智 29

如果在尝试使用SQL Management Studio进行连接时看到此错误消息,请将TrustServerCertificate = True添加到其他连接参数.

  • 米奇,你对这个问题的三个答案做了同样的评论.如果您提供了一些实质性信息或链接到为什么这是"非常非常糟糕的建议",那么对其他读者可能会有所帮助. (22认同)

小智 22

我将这两行添加到 ConnectionString 中并且它起作用了

Trusted_Connection=True
TrustServerCertificate=True
Run Code Online (Sandbox Code Playgroud)


小智 19

"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-O5SR0H0\\SQLEXPRESS;Database=myDataBase;Trusted_Connection=True;TrustServerCertificate=True;"
  }
}
Run Code Online (Sandbox Code Playgroud)


Md *_*iar 19

PM> Scaffold-DbContext "Server=localhost;Database=BookStoresDB;Trusted_Connection=True;TrustServerCertificate=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Run Code Online (Sandbox Code Playgroud)

使用“TrustServerCertificate = True”解决了错误“已成功与服务器建立连接,但在登录过程中发生错误。(提供商:SSL提供商,错误:0 - 证书链由不受信任的机构颁发) .)"

  • `TrustServerCertificate=True` 解决了问题,谢谢! (2认同)

dim*_*its 17

如果您使用 EF Core 7,则会有一个重大更改,在 Microsoft 官方文档中进行了解释 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/writing-更改#encrypt-defaults-to-true-for-sql-server-connections

  • 谢谢。在我的连接字符串中添加“Encrypt=False”后,它起作用了! (3认同)

Orw*_*ile 14

如果你想完全放弃所有安全性:

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

连接字符串

Data Source=localhost; 
Initial Catalog=<YOUR DATABASE HERE>; 
Integrated Security=True; 
Encrypt=True; 
TrustServerCertificate=True; 
User Instance=False
Run Code Online (Sandbox Code Playgroud)

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


小智 12

添加Encrypt=False到您的连接字符串即可


Tro*_*oom 8


就我而言,通过Encrypt=false;TrustServerCertificate=true;扩展连接字符串还不够。

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

更新数据库-详细


Hoq*_*dul 8

就我而言,我在 中更改了多次appsettings.json,但在appsettings.Develpment.json. 更改应用程序设置的开发版本后。效果很好。

"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-M08SV8P;Database=ActivityProject;Trusted_Connection=True;TrustServerCertificate=True;"
},
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


jee*_*u94 7

有关如何使用 SSMS 使 encrypt = False 的指南。仅用于本地发展目的。不建议用于生产用例。

  1. 点击选项>>
  2. 如图所示,取消选择“加密连接”。
  3. 单击连接。<<**繁荣**>>。

在此输入图像描述


Tom*_*sen 6

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

在 SQL Server 上:

  • 在 MMC 中添加证书管理单元
  • 浏览至证书 > 个人 > 证书
  • 选择新证书,右键单击,然后选择“所有任务”>“管理私钥”(此步骤和以下步骤是使密钥与 SQL Server 一起使用的一部分)
  • 添加运行 SQL Server 的标识(如果有疑问,请在服务中查找标识)并具有读取权限。
  • 选择新证书,单击鼠标右键,然后选择“所有任务”>“导出...”
  • 使用默认设置并另存为文件。

在客户端:

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

(我在同一台服务器上执行所有操作,但仍然遇到 SSMS 抱怨的问题,直到我重新启动 SQL 实例。然后我可以在不选中“信任...”复选框的情况下进行加密连接)


小智 6

如果使用版本18,通过pyodbc访问,则为“TrustServerCertificate=yes”,需要在连接中添加


Rub*_*nov 6

当您使用 时SqlPackage.exeEncrypt=False连接字符串中的 会被忽略。

添加/TargetTrustServerCertificate:true到 SqlPackage 命令来修复此问题。


小智 6

简单来说,如果您在本地运行,这就足够了

"ConnectionString": "数据源=(本地);初始目录=BlazorDashboardDb;TrustServerCertificate=True;集成安全性=True;", 1

TrustServerCertificate进行 SSL 处理 Integrated Security进行 Windows 验证,如果 sql 身份验证则添加参数为“用户 ID=adminUsername;密码=adminSecretPasswordwhatever”

要覆盖所有场景,下面的帮助“数据源 =(本地);初始目录 = BlazorDashboardDb;TrustServerCertificate = True;Trusted_Connection = True;集成安全性 = True;MultipleActiveResultSets = true;Encrypt = True;”

Trusted_Connection用于信任连接模式 Encrypt用于凭证

连接到服务器(az-sql)ex:“服务器= tcp:firstserver.database.windows.net,1433;初始目录=第一;持久安全信息= False;用户ID = adminUsername;密码= adminSecretPasswordwhatever;MultipleActiveResultSets = False;加密=True;TrustServerCertificate=True;连接超时=30;"


小智 5

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

  • 这本身并不是一个坏建议。我想说的是,当您需要连接到开发服务器并完成您的工作(例如编码)时,您可以使用它。作为一名软件开发人员,我经常与 DevOps 斗争,他们没有时间快速解决问题,而且我不能在最后期限前浪费宝贵的时间。权衡关闭此选项的数据暴露取决于您的环境,无论是本地还是远程,管理员如何设置,IP 限制,并且可以通过其他解决方法轻松缓解。如果没有关于您的基础设施的一些信息,您就不能说这是一个糟糕的建议。 (9认同)

小智 5

我在通过 SSMS 将 Excel 数据导入 SQLDatabase 时遇到此问题。TrustServerCertificate = True解决办法是在安全部分设置