配置 SQL Server 数据库引擎以加密连接

可以加密到 SQL Server 的所有传入连接,也可以仅为一组特定的客户端启用加密。 对于上述任一方案,首先必须将 SQL Server 配置为使用满足 SQL Server 的证书要求的证书,然后才能在服务器计算机或客户端计算机上执行其他步骤来加密数据。

本文介绍如何为证书配置 SQL Server(步骤 1),以及如何更改 SQL Server 实例的加密设置(步骤 2)。 使用公共商业机构提供的证书时,需要执行这两个步骤来加密到 SQL Server 的所有传入连接。 有关其他方案,请参阅加密与 SQL Server 的连接的特殊情况

步骤 1:将 SQL Server 配置为使用证书

若要将 SQL Server 配置为使用 SQL Server 的证书要求中所述的证书,请执行以下步骤:

  1. 在运行 SQL Server 的计算机上安装证书。
  2. 将 SQL Server 配置为使用已安装的证书。

根据你有权在 SQL Server 计算机上访问的 SQL Server 配置管理器的版本,使用以下过程之一来安装和配置 SQL Server 实例。

安装适用于 SQL Server 2019 及更高版本的 SQL Server 配置管理器的计算机

在 SQL Server 2019 (15.x) 及更高版本中,证书管理已集成到 SQL Server 配置管理器中,并且可以与早期版本的 SQL Server 一起使用。 若要在单个 SQL Server 实例上的故障转移群集配置中或者在可用性组配置中添加证书,请参阅证书管理(SQL Server 配置管理器)。 配置管理器只需几个步骤即可安装证书并将 SQL Server 配置为使用已安装的证书,从而极大地简化了证书管理。

用户的证书存储在本地计算机上。 若要安装证书以供 SQL Server 使用,必须使用具有本地管理员权限的帐户运行 SQL Server 配置管理器。

可以暂时安装 Express 版本的 SQL Server 2019 (15.x) 或更高版本,以使用支持集成的证书管理的 SQL Server 配置管理器。

具有适用于 SQL Server 2017 及更早版本的 SQL Server 配置管理器的计算机

如果使用的是 SQL Server 2017 (14.x) 或更早版本,并且适用于 SQL Server 2019 (15.x) 的 SQL Server 配置管理器不可用,请按照下面的步骤在 SQL Server 计算机上安装和配置证书:

  1. 在“开始”菜单上,选择“运行”,然后在“打开”框中键入“MMC”,然后选择“确定”。
  2. 在 MMC 控制台中的“文件”菜单上,选择“添加/删除管理单元...”。
  3. 在“添加或删除管理单元”对话框中,选择“证书”,然后选择“添加”。
  4. 在“证书管理单元”对话框中,选择“计算机帐户”,然后选择“下一步”>“完成”。
  5. 在“添加/删除管理单元”对话框中,选择“确定” 。
  6. 在 MMC 控制台中,展开“证书(本地计算机)”>“个人”,右键单击“证书”,指向“所有任务”,然后选择“导入”。
  7. 完成“证书导入向导”以将证书添加到计算机中。
  8. 在 MMC 控制台中,右键单击导入的证书,指向“所有任务”,然后选择“管理私钥”。 在“安全”对话框中,为 SQL Server 服务帐户使用的用户帐户添加读取权限。
  9. 在“SQL Server 配置管理器”中,展开“SQL Server 网络配置”、右键单击“<服务器实例> 的协议”,然后选择“属性”。
  10. 在“<实例名称> 的协议属性”对话框中的“证书”选项卡上,从“证书”框的下拉菜单中选择所需证书,然后选择“确定”。
  11. 如果需要加密到 SQL Server 的所有连接,请参阅步骤 2:在 SQL Server 中配置加密设置。 如果只想为特定客户端启用加密,请重启 SQL Server 服务,并参阅加密与 SQL Server 的连接的特殊情况

注意

若要在可用性组配置中安装证书,请从主节点开始,对可用性组中的每个节点重复上述过程。

重要

SQL Server 服务帐户必须具有对用于在 SQL Server 实例上强制加密的证书的读取权限。 对于非特权服务帐户,必须将读取权限添加到证书中。 否则可能会导致 SQL Server 服务重启失败。

故障转移群集实例的额外过程

SQL Server 用于加密连接的证书是在以下注册表项中指定的:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\SuperSocketNetLib\Certificate

此项包含称为指纹的证书属性,该属性标识服务器中的每个证书。 在群集环境中,此项设置为 Null,即使存储中存在正确的证书也是如此。 若要解决此问题,在将证书安装到每个节点后,必须在每个群集节点上执行以下额外步骤:

  1. 导航到存储完全限定的域名 (FQDN) 证书的证书存储。 在证书的属性页上,转到“详细信息”选项卡,并将证书的指纹值复制到记事本窗口。

  2. 在记事本中删除指纹值中十六进制字符之间的空格。

  3. 启动“注册表编辑器”,导航到以下注册表项,然后粘贴步骤 2 中的值:

    HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib\Certificate

  4. 如果 SQL 虚拟服务器当前位于此节点上,请故障转移到群集中的另一个节点,然后重新启动发生了注册表更改的节点。

  5. 在所有节点上重复此过程。

警告

错误编辑注册表会严重损坏您的系统。 更改注册表之前,建议备份计算机中所有重要的数据。

注意

SQL Server 2008 R2 (10.50.x) 和 SQL Server 2008 R2 (10.50.x) Native Client (SNAC) 支持通配符证书。 SNAC 已被弃用,并已替换为 Microsoft OLE DB Driver for SQL ServerMicrosoft ODBC Driver for SQL Server。 其他客户端可能不支持通配符证书。

无法使用 SQL Server 配置管理器来选择通配符证书。 要使用通配符证书,必须编辑 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer\SuperSocketNetLib 注册表项,并为“证书”值输入证书的指纹(不留空格)。

备注

若要在故障转移群集中使用加密,必须在故障转移群集的所有节点上安装带有虚拟服务器的完全限定 DNS 名称的服务器证书。 可设置“SQL Server 网络配置”的“virtsql 的协议”属性框上的“ForceEncryption”选项,将其值设置为“是” 。

当在 Azure VM 上创建 Azure 搜索索引器到 SQL Server 的加密连接时,请参阅 Azure 虚拟机上到 SQL Server 实例的索引器连接

步骤 2:在 SQL Server 中配置加密设置

仅当想要为所有客户端强制执行加密通信时才需要执行以下步骤:

  1. 在 SQL Server 配置管理器中,展开“SQL Server 网络配置”、右键单击“<服务器实例> 的协议”,然后选择“属性”。
  2. 在“标志”选项卡的“ForceEncryption”框中,选择“是”,然后选择“确定”关闭该对话框。
  3. 重启 SQL Server 服务。

注意

某些证书应用场景可能要求在客户端计算机上和客户端应用程序中实现其他步骤,以确保客户端和服务器之间的连接加密。 有关详细信息,请参阅加密与 SQL Server 的连接的特殊情况

详细信息

登录数据包加密与数据包加密

概括而言,SQL Server 客户端应用程序与 SQL Server 之间的网络流量中有两种类型的数据包:凭据数据包(登录数据包)和数据包。 在配置加密时(无论是服务器端还是客户端),这两种数据包类型始终是加密的。 但是,即使你未配置加密,在客户端应用程序连接到 SQL Server 时传输的凭据(位于登录数据包中)也始终是加密的。 SQL Server 使用来自受信任的证书颁发机构(如果可用)的满足证书要求的证书。 系统管理员可以使用本文前面讨论的过程之一手动配置此证书,此证书也可以出现在 SQL Server 计算机上的证书存储中。

SQL Server 生成的自签名证书

SQL Server 使用来自受信任的证书颁发机构(如果可用)的证书来加密登录数据包。 如果未安装受信任的证书,SQL Server 将在启动期间生成自签名证书(回退证书),并使用该自签名证书来加密凭据。 此自签名证书有助于提高安全性,但它不会防范通过服务器进行的身份欺骗。 如果使用了自签名证书,并且“ForceEncryption”选项的值设置为“是”,将使用自签名证书对通过网络在 SQL Server 和客户端应用程序之间传输的所有数据进行加密。

使用自签名证书时,SQL Server 会将以下消息记录到错误日志中:

已成功加载自行生成的证书以进行加密。

SQL Server 2016 (13.x) 及更早版本使用 SHA1 算法。 但是,从 SQL Server 2016 (13.x) 开始,SHA1 算法和许多旧算法已被弃用。 有关详细信息,请参阅 SQL Server 2016 中弃用的数据库引擎功能

在这些环境中,如果使用的是 SQL Server 自动生成的自签名证书(无论是用于登录前握手,还是用于加密所有服务器与客户端的通信),漏洞检测软件或安全软件或公司策略都可能会将此用途标记为安全问题。 对于这些方案,可以使用以下选项:

  • 创建使用更加强大的加密算法的新自签名证书或第三方证书,并将 SQL Server 配置为使用此新证书。
  • 由于你现在已了解标记的原因,因此可以忽略此消息(不建议)。
  • 升级到 SQL Server 2017 (14.x) 或更高版本,这将为自签名证书使用更加强大的哈希算法 (SHA256)。

用于为 SQL Server 创建自签名证书的 PowerShell 脚本

以下代码片段可用于在运行 SQL Server 的计算机上创建自签名证书。 证书满足独立 SQL Server 实例的加密要求,并保存在本地计算机的证书存储中(以管理员身份启动 PowerShell):

# Define parameters
$certificateParams = @{
    Type = "SSLServerAuthentication"
    Subject = "CN=$env:COMPUTERNAME"
    DnsName = @("{0}" -f [System.Net.Dns]::GetHostByName($env:computerName).HostName, 'localhost')
    KeyAlgorithm = "RSA"
    KeyLength = 2048
    HashAlgorithm = "SHA256"
    TextExtension = "2.5.29.37={text}1.3.6.1.5.5.7.3.1"
    NotAfter = (Get-Date).AddMonths(36)
    KeySpec = "KeyExchange"
    Provider = "Microsoft RSA SChannel Cryptographic Provider"
    CertStoreLocation = "cert:\LocalMachine\My"
}

# Call the cmdlet
New-SelfSignedCertificate @certificateParams

验证网络加密

若要验证是否已成功配置和启用网络加密,请运行以下 Transact-SQL 查询:

USE [master];
GO

SELECT DISTINCT (encrypt_option)
FROM sys.dm_exec_connections;
GO

encrypt_option 是一个布尔值,指示是否为此连接启用加密。 如果值为 TRUE,则连接将安全加密。 如果值为 FALSE,则连接不加密。

SQL Server 证书行为在权限方面的行为

如果满足以下所有条件,SQL Server 服务会自动检测证书并使用证书进行加密:

  • 证书的主题包含了计算机的完全限定域名 (FQDN)
  • 证书会安装到本地计算机的证书存储中
  • 已授予 SQL Server 服务帐户对证书私钥的访问权限

即使没有在 SQL Server 配置管理器中选择证书,也会这样使用。

若要覆盖此行为,请执行以下操作之一:

  • 再配置一个用于 SQL Server 配置管理器的证书

  • 移除 SQL Server 服务帐户对不需要的证书的权限