使用严格加密连接到 SQL Server

适用于:SQL Server 2022 (16.x) 及更高版本

严格的连接加密强制执行良好的安全做法,并使标准网络设备可以管理 SQL Server 流量。 严格加密使用表格数据流 (TDS) 8.0,它将 TDS 会话包装在传输层安全性(TLS)中,以便进行端到端加密。

本文介绍如何使用严格的连接类型连接到 SQL Server 2022(16.x)及更高版本。

先决条件

使用 .NET 应用程序连接 SQL Server

有关使用 strict 加密类型生成和连接到 SQL Server 的信息,请参阅有关如何正确生成连接字符串的连接字符串语法。 有关新的连接字符串属性的详细信息,请参阅连接字符串加密属性的其他更改

使用 ODBC DSN 进行连接

可以使用 ODBC DSN 到 SQL Server 测试连接加密类型为 Strict 的连接。

  1. 在 Windows 中搜索 ODBC 数据源应用

    ODBC 数据源应用的屏幕截图。

  2. 通过查看 ODBC 数据源管理员的“驱动程序”选项卡,确保具有最新的 ODBC 驱动程序

    可用驱动程序的屏幕截图。

  3. 在“系统 DSN”选项卡中,选择“添加”以创建 DSN。 然后选择 ODBC Driver 18 for SQL Server。 选择“完成”。 我们将使用它来测试连接。

  4. 在“创建 SQL Server 的新数据源”窗口中,提供此数据源的名称,并将 SQL Server 2022 (16.x) 服务器名称添加到“服务器”。 选择下一步

    使用 ODBC 驱动程序创建数据源的屏幕截图。

  5. 在进入具有连接加密的屏幕之前,使用所有设置的所有默认值。 选择“严格”。 如果输入的服务器名称不同于证书中的名称,或者改用 IP 地址,请将证书中的 HostName 设置为证书中使用的主机名。 选择“完成”。

    显示严格加密类型的屏幕截图。

  6. 当“ODBC Microsoft SQL Server 安装程序”对话框弹出时,选择“测试数据源...”按钮以测试连接。 这应该针对此测试强制执行到 SQL Server 的 strict 连接。

还可以使用具有通用数据链接 (UDL) 的 OLE DB 驱动程序测试与具有 strict 加密的 SQL Server 的连接。

  1. 若要创建 UDL 文件以测试连接,请右键单击桌面,然后选择“新建文本文档”>。 需要将扩展从 txt 更改为 udl. 你可以用任何你想要的名字给文件命名。

    注意

    需要能够查看扩展名称,以便将扩展从 txt 此更改为 udl。 如果看不到该扩展名,则可以通过打开文件资源管理器>视图>显示>文件扩展名来查看扩展名。

  2. 打开创建的 UDL 文件,然后转到“提供程序”选项卡,选择“Microsoft OLE DB Driver 19 for SQL Server”。 选择下一步>>

    “UDL” 提供者屏幕的截图。

  3. 在“连接”选项卡上,输入 SQL Server 服务器名称,然后选择用于登录 SQL Server 的身份验证方法

    UDL 连接屏幕的屏幕截图。

  4. “高级”选项卡中,对于“连接加密”,选择“严格”。 如果输入的服务器名称不同于证书中的名称,或者改用 IP 地址,请将证书中的 HostName 设置为证书中使用的主机名。 完成后,返回到“连接”选项卡

    UDL 高级屏幕的屏幕截图。

  5. 选择测试连接以测试具有 strict 连接加密的连接。

    UDL 连接屏幕和测试连接的屏幕截图。

使用 SSMS 进行连接

从版本 20 开始,可以在“连接到服务器”对话框的“登录名”选项卡上的“SQL Server Management Studio”(SSMS)中强制实施严格的加密:

SQL Server Management Studio 中“连接到服务器”对话框的屏幕截图。

连接到 AlwaysOn 可用性组

从 SQL Server 2025(17.x)开始,可以使用 StrictMandatory 连接加密类型加密 Windows Server 故障转移群集与 Always On 可用性组副本之间的通信。 如果可用性组基于 Windows Server 故障转移群集,则只能强制执行加密。 其他类型的可用性组不支持严格的加密。

注意

数据库镜像终结点的加密是单独配置的,不支持 TLS。 有关详细信息,请参阅 可用性组和数据库镜像中的传输安全性

这些步骤因您的可用性是否已存在而异。

若要强制对新的可用性组进行严格加密,请执行以下步骤:

  1. 如果尚未导入 TLS 证书,请根据证书要求TLS 证书导入可用性组的每个副本。 导入证书后重启每个 SQL Server 实例。
  2. 使用本文中所述的方法之一测试与每个 SQL Server 副本的连接,以强制加密。
  3. CREATE AVAILABILITY GROUP,在可用性组的 CLUSTER_CONNECTION_OPTIONS 子句中将 Encrypt 属性设置为 Strict。 这可确保与可用性组的所有连接都使用指定的加密类型。
  4. 如果可用性组当前处于联机状态,则将可用性组故障转移到次要副本,以将新的加密设置应用到可用性组。 如果可用性组无法联机,可能是 ClusterConnectionOptions 未正确设置。 检查 cluster.log 是否存在与群集无法连接到 SQL Server 副本相关的 ODBC 错误 。 您可以选择在新的次要副本处于联机状态并连接到可用性组后,将可用性组故障转移回原始主要副本。
  5. (可选)通过将 “强制严格加密 ”选项设置为 Yes 每个副本的连接协议的 SQL Server 配置管理器 属性,可以进一步强制加密。 此设置可确保与可用性组副本的所有连接都使用严格的加密。 更改此设置后,重启每个 SQL Server 副本。

连接到故障转移群集实例

从 SQL Server 2025 (17.x)开始,可以使用Strict连接加密类型,加密 Windows Server 故障转移群集与Mandatory之间的通信。 为此,请执行以下步骤:

  1. 如果尚未导入 TLS 证书,请根据证书要求TLS 证书导入到故障转移群集的每个节点。 导入证书后重启 SQL Server 实例。
  2. 使用本文中提到的强制加密方法之一来测试到故障转移群集实例的连接。
  3. ALTER SERVER CONFIGURATION使用CLUSTER_CONNECTION_OPTIONS子句将Encrypt属性设置为MandatoryStrict。 这可确保与故障转移群集实例的所有连接都使用指定的加密类型。
  4. 将实例故障转移到次要节点,以将新的加密设置应用到故障转移群集实例。 如果故障转移群集实例无法联机,可能是 ClusterConnectionOptions 未正确设置。 检查 cluster.log 以查找与群集无法连接到 SQL Server 实例相关的 ODBC 错误。 您可以选择在新的次要节点处于联机状态并连接到故障转移群集实例后,将实例故障转移回原始主要节点。
  5. (可选)可以通过将 “强制严格加密 ”选项设置为 Yes 群集中每个节点的连接协议的 SQL Server 配置管理器 属性来进一步强制加密。 此设置可确保与故障转移群集实例的所有连接都使用严格的加密。 对次要节点进行此更改,将实例故障转移到该节点,然后对主要节点进行更改。

SQL Server 代理 连接加密

从 SQL Server 2025(17.x)开始,SQL Server 代理使用 Microsoft ODBC Driver 18 for SQL Server,该驱动程序支持 TDS 8.0 和 TLS 1.3。 SQL Server 代理自动调整其连接加密,以匹配SQL Server实例的配置方式。

SQL Server 代理 如何确定加密方式

SQL Server 代理启动时,它会在本地计算机上查询以下注册表项,以确定为SQL Server配置的加密级别:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL17.<InstanceName>\MSSQLServer\SuperSocketNetLib\ForceEncryption
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL17.<InstanceName>\MSSQLServer\SuperSocketNetLib\ForceStrict
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL17.<InstanceName>\MSSQLServer\SuperSocketNetLib\SubjectAlternativeName(SQL Server 2025 (17.x) 中的新增功能)

根据这些值,SQL Server 代理选择其连接模式:

  • 如果启用了强制严格加密,SQL Server 代理使用 strict (TDS 8.0) 进行连接。
  • 如果启用强制加密,SQL Server 代理使用 mandatory (TDS 7.x) 进行连接。
  • 如果两者均未启用,SQL Server 代理使用 optional (TDS 7.x) 进行连接。

本地 T-SQL 作业步骤继承与SQL Server 代理服务相同的加密配置。 如果SQL Server 代理连接strict,则服务器上本地运行的 T-SQL 作业使用相同的选项。

Important

TLS 1.3 仅适用于严格的加密。 如果SQL Server实例仅在 OS 级别启用了 TLS 1.3,但仅设置了强制加密(而不是强制加密),SQL Server 代理无法启动,因为mandatory模式optional需要 TDS 7.x,这与 TLS 1.3 不兼容。

TLS 和加密配置矩阵

已启用 TLS 版本 配置设置 SQL Server 代理结果 Notes
仅支持 TLS 1.3 强制严格加密 连接成功 TDS 8.0 使用严格加密
仅支持 TLS 1.3 强行加密 无法连接 TLS 1.3 要求严格
仅支持 TLS 1.3 None 无法连接 TLS 1.3 需要严格加密
仅支持 TLS 1.2 强制严格加密 连接成功 TDS 8.0 可以使用 TLS 1.2
仅支持 TLS 1.2 强行加密 连接成功 具有强制要求的 TDS 7.x
仅支持 TLS 1.2 None 连接成功 具有可选选项的 TDS 7.x
TLS 1.2 和 TLS 1.3 强制严格加密 连接成功 TDS 8.0 使用严格加密
TLS 1.2 和 TLS 1.3 强行加密 连接成功 具有强制要求的 TDS 7.x
TLS 1.2 和 TLS 1.3 None 连接成功 具有可选选项的 TDS 7.x

验证 SQL Server 代理的协商加密

SQL Server 代理连接后,运行以下查询以确认其加密模式:

SELECT s.session_id, c.encrypt_option, s.program_name, s.client_interface_name, s.nt_user_name
FROM sys.dm_exec_connections AS c
INNER JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
WHERE s.program_name LIKE 'SQLAgent%';

当 SQL Server 代理 以加密方式连接时,encrypt_option列返回TRUE

有关SQL Server 代理本身的概述,请参阅SQL Server 代理

使用 SQL Server 配置管理器 强制严格加密

可以从 SQL Server 2022(16.x)开始,使用 SQL Server 配置管理器 强制实施严格的加密。 为此,请执行以下步骤:

  1. 打开 SQL Server 配置管理器

  2. 在左窗格中,展开 SQL Server 网络配置,然后选择 [InstanceName] 的协议

  3. 右键单击 TCP/IP,然后选择“ 属性”。

  4. “TCP/IP 属性”对话框中,转到“标志”选项卡,然后选择“强制严格加密”选项的“是”:

    SQL Server 配置管理器 中强制严格加密选项的屏幕截图。

  5. 在维护时段内重启 SQL Server 实例以应用更改。

注解

如果看到 SSL certificate validation failed,请验证以下项:

  • 服务器证书在用于测试的计算机上有效
  • 以下至少一个条件成立:
    • 提供程序 SQL Server 会匹配证书中的 CA 名称或 DNS 名称之一。
    • HostNameInCertificate 连接字符串属性与证书中的 CA 名称或 DNS 名称之一匹配。