原始产品版本:SQL Server
原始 KB 数: 2007728
总结
本文可帮助你解决“从远程服务器收到的证书是由不受信任的证书颁发机构颁发的”错误,该错误是在客户端与 SQL Server 建立加密的 (TLS) 连接时发生的。 此错误表示客户端无法验证 SQL Server 实例在 TLS 握手期间提供的证书,通常是因为签发该证书的证书颁发机构(CA)不在客户端的“受信任的根证书颁发机构”证书存储中,或者因为 SQL Server 使用的是自签名证书。
通过在客户端计算机上安装颁发 CA 证书、信任服务器证书而不验证( 信任服务器证书 设置)或更改客户端或服务器上的加密配置来解决此错误。 最新版本的多个客户端驱动程序和工具已更改其默认值以要求加密,因此,即使服务器上没有任何更改,驱动程序或工具升级后也可能会出现此错误。
现象
连接到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生成的自签名证书 | No. 自签名证书不会显示在此证书存储中。 |
当客户端建立与SQL Server的加密连接时,安全通道(Schannel)通过在本地计算机上搜索受信任的根证书颁发机构存储来生成受信任的证书颁发机构列表。 在 TLS 握手期间,服务器向客户端发送其公钥证书。 公钥证书的颁发者称为证书颁发机构(CA)。 客户端必须确认其信任该 CA,而它是通过预先知晓受信任 CA 的公钥来做到这一点的。 当 Schannel 检测到颁发了不受信任的证书颁发机构的证书(例如在前两种情况下),将收到 “症状 ”部分中列出的错误消息。
如果未配置或检测到合适的证书,数据库引擎会在启动期间生成自签名回退证书。 它使用此证书来加密登录凭据,并在启用服务器端或客户端加密时,整个连接。 默认情况下,客户端不信任自签名证书,因此,即使客户端和服务器在同一台计算机上运行,SQL Server的默认安装也会发生此错误。 有关详细信息,请参阅 登录数据包加密与数据包加密。
驱动程序或工具升级后出现此错误的原因
下表中的客户端驱动程序和工具版本更改了其默认值,要求加密。 升级到其中一个版本后,客户端会加密连接并验证服务器证书,即使服务器配置未更改。 早期版本默认不需要加密,因此除非显式请求加密,否则不会验证证书。
| 客户端驱动程序或工具 | 版本 | 默认加密行为 |
|---|---|---|
Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL19) |
19 及更高版本 |
Encrypt 默认值为 Mandatory |
| Microsoft SQL Server 的 ODBC 驱动程序 | 18 及后续版本 |
Encrypt 默认值为 Mandatory |
Microsoft.Data.SqlClient |
4.0 及更高版本 |
Encrypt 默认值为 True |
| SQL Server Management Studio (SSMS) | 20 及更高版本 | 加密 默认为 必需 |
如果在将应用程序从 SQL Server Native Client 11.0(SNAC)迁移到 Microsoft OLE DB 驱动程序 19 或 Microsoft ODBC 驱动程序 18 后立即看到此错误,请参阅驱动程序升级后不信任的证书链。
SNAC 未随 SQL Server 2022(16.x) 及更高版本或 SSMS 19 及更高版本一起提供,不建议用于新开发。 请改用 Microsoft OLE DB Driver for SQL Server、Microsoft ODBC Driver for SQL Server 或 Microsoft.Data.SqlClient。 有关详细信息,请参阅 SQL Server Native Client 的支持策略。
解决方案
如果有意使用来自非受信任机构或自签名证书的证书来加密到SQL Server的连接,请使用以下选项之一:
- 若要保留证书验证并永久修复信任问题,请使用 选项 1:在客户端计算机上安装证书颁发机构。
- 若要在不安装证书的情况下立即连接,请使用 选项 2:信任服务器证书而不验证它。 此选项是最快的修补程序,并且大多数用户在SQL Server使用其默认自签名证书时需要的选项。
- 若要停止要求加密,或将证书替换为受信任的颁发机构中的证书,请使用 选项 3:更改加密配置。
选项 1:在客户端计算机上安装证书颁发机构
对于场景 1,请将证书颁发机构添加到发起加密连接的客户端计算机上的“受信任的根证书颁发机构”存储中。 为此,请按顺序完成 步骤 1:将服务器证书导出到文件 和 步骤 2:在客户端计算机上安装根证书颁发机构 (CA) 证书 这两个步骤。
步骤 1:将服务器证书导出到文件
在SQL Server计算机上,导出SQL Server用于文件的证书。 以下步骤使用 caCert.cer 作为示例文件名。 在在此过程中创建该文件之前,此文件不存在。 选择名称和位置。
选择“开始”,输入 mmc,然后打开Microsoft 管理控制台。
选择 “文件”>“添加/删除管理单元”。
在“可用的管理单元”列表中,选择“证书”,然后选择“添加”。
选择 “计算机帐户”,选择“ 下一步”,选择 “本地计算机:”(运行此主机的计算机),然后选择“ 完成”。
注意
SQL Server证书安装在本地计算机\个人证书存储中。 如果选择“我的用户帐户”,MMC 将打开其他证书存储,并且不会显示SQL Server证书。
选择“确定”以关闭“添加/删除管理单元”对话框。
在左窗格中,展开 “证书”(本地计算机),展开“ 个人”,然后选择“ 证书”。
右键单击SQL Server使用的证书,然后选择“所有任务>导出”。
选择下一步以跳过证书导出向导的欢迎页。
确认 “否”,不导出私钥 处于选中状态,然后选择“ 下一步”。
确保已选择DER 编码的二进制 X.509 (.CER)或Base-64 编码的 X.509 (.CER),然后选择下一步。
输入导出文件名,例如 caCert.cer。
选择“ 下一步”,然后选择“ 完成 ”导出证书。
将导出 .cer 文件复制到客户端计算机。
步骤 2:在客户端计算机上安装根证书颁发机构(CA)
在客户端计算机上,打开 MMC,选择 “文件”>>“添加/删除管理单元”,在 “可用管理单元” 列表中选择 “证书”,然后选择 “添加”。
在“证书”管理单元对话框中,选择“计算机账户”,然后选择“下一步”。
在 “选择计算机 ”窗格中,选择 “本地计算机:”(运行此控制台的计算机),然后选择“ 完成”。
单击“确定”关闭“添加或删除管理单元”对话框。
在 MMC 的左窗格中,展开 “证书(本地计算机)” 节点。
展开“受信任的根证书颁发机构”节点,右键单击“证书”子文件夹,选择“所有任务”,然后选择“导入”。
在 “证书导入向导”的 “欢迎 ”页上,选择“ 下一步”。
在 “要导入 的文件”页上,选择“ 浏览”。
浏览到caCert.cer证书文件的位置,选择该文件,然后选择“打开”。
在 “要导入 的文件”页上,选择“ 下一步”。
在 “证书存储 ”页上,接受默认选择,然后选择“ 下一步”。
在 “完成证书导入向导 ”页上,选择“ 完成”。
选项 2:信任服务器证书而不验证它
对于方案 1 和 2,请在客户端应用程序中设置 信任服务器证书 设置。 此设置使连接保持加密状态,但会跳过证书验证。 关键字名称和接受的值取决于客户端库:
| 客户端库 | 连接字符串关键字 |
|---|---|
Microsoft.Data.SqlClient |
TrustServerCertificate=True |
| Microsoft SQL Server 的 ODBC 驱动程序 | TrustServerCertificate=yes |
| Microsoft OLE DB Driver for SQL Server(提供程序字符串) | TrustServerCertificate=yes |
Microsoft OLE DB Driver for SQL Server(ADO 或 IDataInitialize) |
Trust Server Certificate=true |
| 用于 SQL Server 的 Microsoft JDBC 驱动程序 | trustServerCertificate=true |
如果使用 SQL Server Management Studio (SSMS) 20 或更高版本进行连接,请在“连接到服务器”对话框的“登录”页上选中“信任服务器证书”复选框。 在早期版本的 SSMS 中,在“连接到服务器”窗口中选择“选项”,选择“连接属性”选项卡,然后选择“信任服务器证书”。
有关如何为客户端库配置此设置的详细信息,请参阅以下文章:
- Microsoft.Data.SqlClient 中的加密和证书验证
- OLE DB Driver for SQL Server中的加密和证书验证
- 用于 ODBC Driver for SQL Server 的 DSN 和连接字符串关键字及属性
- 使用 Microsoft JDBC Driver for SQL Server 进行加密连接
- 在 SQL Server Native Client 中使用不带验证的加密(旧版客户端)
注意
信任服务器证书设置不会禁用加密。 连接保持加密状态,但客户端不会验证服务器的标识。
Caution
使用自签名证书的加密连接不提供强大的安全性。 他们容易受到中间人攻击。 不要依赖于生产环境中或连接到 Internet 的服务器中使用自签名证书的 TLS。
选项 3:更改加密配置
如果前几节所述的配置是意外的,请使用以下选项之一来解决此问题:
将数据库引擎配置为使用来自受信任机构的证书。 此选项是最安全的长期修复,因为客户端随后无需进行任何额外配置即可验证证书。 有关详细信息,请参阅启用与 SQL Server 数据库引擎 和证书要求的加密连接。
如果不需要加密,则为:
在客户端应用程序中关闭加密。 将
Use Encryption for Data=Optional设置为 OLE DB 提供程序字符串,将IDataInitialize设置为 OLE DB ADO 或Encrypt=no,将Microsoft.Data.SqlClient设置为 ODBC,并将Encrypt=False设置为Encrypt=Optional或 Microsoft JDBC 驱动程序。 在 SSMS 20 及更高版本中,在“连接到服务器”对话框的“登录”页上将“加密”设置为“可选”。使用 SQL Server 配置管理器关闭服务器端加密。 展开SQL Server网络配置,右键单击实例名称>的<协议,选择“属性”,选择“标志”选项卡,将“强制加密”设置为“否”,然后重启SQL Server服务。 有关详细信息,请参阅 MSSQLSERVER 属性的协议(标志选项卡)。
Warning
如果关闭加密,凭据和数据通过网络不受保护传输。 仅在受信任的独立网络上关闭加密。