连接到 SQL Server 时出现“从远程服务器收到的证书由不受信任的证书颁发机构颁发”错误

本文可帮助你解决尝试与 SQL Server 建立加密连接时出现的问题。

原始产品版本:SQL Server
原始 KB 编号: 2007728

症状

当连接到 SQL Server 时,你可能会收到以下错误消息:

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

此外,以下错误消息记录在 Windows 系统事件日志中。

Log Name:      System  
Source:        Schannel  
Date:          10/13/2020 3:03:31 PM  
Event ID:      36882  
Task Category: None  
Level:         Error  
Keywords:  
User:        USERNAME  
Computer:     COMPUTERNAME  
Description:  
The certificate received from the remote server was issued by an untrusted certificate authority. Because of this, none of the data contained in the certificate can be validated. The TLS connection request has failed. The attached data contains the server certificate.

原因

当尝试使用不可验证的证书与 SQL Server 建立加密连接时,会发生此错误。 这可能会发生在以下场景中:

应用场景 服务器端加密 客户端加密 证书类型 受信任的根证书颁发机构存储中的证书颁发机构
1 从不受信任的源预配证书, (证书颁发机构未在客户端计算机上的受信任根证书颁发机构中列为受信任颁发机构)
2 SQL Server 自生成证书 自签名证书不会显示在此存储中。

在建立与 SQL Server 的加密连接时,安全通道 (Schannel) 通过搜索本地计算机上的受信任的根证书颁发机构存储来创建受信任的证书颁发机构列表。 在 TLS 握手期间,服务器会将其公钥证书发送到客户端。 公钥证书的颁发者称为证书颁发机构 (CA)。 客户端必须确保证书颁发机构是客户端信任的证书颁发机构之一。 这是通过提前知晓受信任 CA 的公钥来实现的。 当 Schannel 检测到由不受信任的证书颁发机构颁发的证书时(例如在前两种情况下),你会收到 “症状 ”部分中列出的错误消息。

解决方案

如果有意使用来自不可信机构的证书或自签名证书来加密与 SQL Server 的连接,则可使用以下选项之一:

对于方案 1,请将证书颁发机构添加到启动加密连接的客户端计算机上的受信任的根证书颁发机构存储中。 为此,请完成“ 导出服务器证书 ”和 “安装根证书颁发机构 (CA) 该顺序中后续部分中列出的客户端计算机过程。

导出服务器证书

本例使用名为“caCert.cer”的文件作为证书文件。 你必须从服务器获取此证书文件。 以下步骤说明如何将服务器证书导出到文件:

  1. 依次单击“开始”和“运行”,然后键入“MMC”。 (MMC 是 Microsoft 管理控制台的英文首字母缩略词。)

  2. 在 MMC 中,打开“证书”

  3. 展开“个人”,然后展开“证书”

  4. 右键单击服务器证书,然后选择“所有任务导出>”。

  5. 单击“下一步”跳过“证书导出”向导的“欢迎”对话框。

  6. 确认“ 否,不要导出私钥 ”处于选中状态,然后选择“ 下一步”。

  7. 确保已选择“DER 编码的二进制 X.509 (.CER)”或“Base-64 编码的 X.509 (.CER)”,然后单击“下一步”

  8. 输入导出文件名。

  9. 单击“下一步”,然后单击“完成”以导出证书。

在客户端计算机上安装根证书颁发机构 (CA)

  1. 在客户端计算机上启动 MMC 的证书管理单元,然后添加证书管理单元。

  2. 在“ 证书管理单元 ”对话框中,选择“ 计算机 帐户”,然后选择“ 下一步”。

  3. “选择计算机 ”窗格中,选择“ 本地计算机: (此主机在) 上运行的计算机 ,然后选择” 完成”。

  4. 选择 “确定” 以关闭“ 添加或删除管理单元 ”对话框。

  5. 在 MMC 的左窗格中,展开 “证书 (本地计算机) 节点。

  6. 展开 “受信任的根证书颁发机构” 节点,右键单击“ 证书 ”子文件夹,选择“ 所有任务”,然后选择“ 导入”。

  7. “证书导入向导”“欢迎”页上,选择“ 下一步”。

  8. 在“ 要导入的文件 ”页上,选择“ 浏览”。

  9. 浏览到 caCert.cer 证书文件的位置,选择该文件,然后选择 “打开”。

  10. 在“ 要导入的文件 ”页上,选择“ 下一步”。

  11. “证书存储 ”页上,接受默认选择,然后选择“ 下一步”。

  12. “完成证书导入向导” 页上,选择“ 完成”。

对于方案 1 和 2,请在客户端应用程序中将 “信任服务器证书 ”设置设置为 true

有关如何执行此操作的详细信息,请参阅以下主题:

注意

如果使用SQL Server Management Studio,请选择“选项”选项卡,然后在“连接属性”选项卡中选择“信任服务器证书”选项。

谨慎: 使用自签名证书加密的 SSL 连接不提供强安全性。 它们容易受到 man-in-the-middle 攻击。 不应依赖在生产环境中或连接到 Internet 的服务器上使用自签名证书的 SSL。

如果本文前面部分中讨论的配置是计划外的配置,则可以使用以下选项来解决此问题:

  • 根据“启用与数据库引擎的加密连接”中的过程,将数据库引擎配置为使用加密。

  • 如果不需要加密:

    • 在客户端应用程序中禁用加密设置(如果有)。

    • 使用 SQL Server Configuration Manager 禁用服务器端加密。 有关如何执行此操作的详细信息,请参阅 配置服务器