SQL Server 的证书要求

本文介绍 SQL Server 的证书要求,以及如何检查证书是否符合这些要求。

SQL Server 加密的证书要求

若要使用传输层安全性(TLS)进行 SQL Server 加密,需要预配满足以下条件的证书(三种数字类型之一):

  • 证书必须位于本地计算机证书存储或 SQL Server 服务帐户证书存储中。 建议使用本地计算机证书存储,因为它避免使用 SQL Server 启动帐户更改重新配置证书。

  • SQL Server 服务帐户必须具有访问 TLS 证书所需的权限。 有关详细信息,请参阅 通过导入证书加密到 SQL Server 的连接

  • 当前系统时间必须晚于证书的“有效起始时间”属性的值,并早于“有效截止时间”属性的值。 有关详细信息,请参阅 过期的证书

    注释

    该证书必须用于服务器身份验证。 这需要证书的增强型密钥用法属性来指定服务器身份验证(1.3.6.1.5.5.7.3.1)。

  • 必须使用 KeySpecAT_KEYEXCHANGE 选项创建该证书。 这需要使用 旧加密存储提供程序 来存储私钥的证书。 通常,证书的密钥使用属性(KEY_USAGE)还包括密钥加密(CERT_KEY_ENCIPHERMENT_KEY_USAGE)和数字签名(CERT_DIGITAL_SIGNATURE_KEY_USAGE)。

  • 主题备用名称应包含客户端可能用于连接到 SQL Server 实例的所有名称。

客户端必须能够验证服务器所用证书的所有权。 如果客户端具有对服务器证书进行签名的证书颁发机构所颁发的公钥证书,则不需要进一步的配置。 Microsoft Windows 包含多个证书颁发机构所颁发的公钥证书。 如果服务器证书是由客户端没有公钥证书的公共或专用证书颁发机构签名的,则必须在要连接到 SQL Server 的每个客户端上安装对服务器证书进行签名的证书颁发机构的公钥证书。

重要

如果在计算机存储中存在证书,但这些证书仅满足上述列表中的某些要求,并且它们是通过 SQL Server Configuration Manager 或注册表项手动配置的,那么 SQL Server 将无法启动。 选择满足所有要求的另一个证书或删除 SQL Server 使用的证书,直到可以预配满足要求或使用自生成证书的证书,如 SQL Server 生成的自签名证书中所述。

AlwaysOn 可用性组

如果 SQL Server 实例是 AlwaysOn 可用性组的一部分,则可以使用以下方法之一创建证书:

  • 方法 1:对可用性组的所有副本使用一个证书。 公用名是任意的,因此可以是任何占位符值。 可用性组中所有 SQL Server 副本的主机名和 FQDN 以及可用性组侦听器名称应包含在证书的 使用者可选名称 中。 如果在生成原始证书后将其他副本添加到可用性组,则必须使用所有副本的名称重新生成证书,并 重新导入 到每个副本。 证书还必须 导入 到连接到可用性组副本或可用性组侦听器的所有客户端上的证书存储区,除非证书由公共或官方证书颁发机构(CA)签名。 如果未在证书中包含可用性组副本和侦听器名称,则需要在连接到可用性组时在连接字符串的值中包含HostNameInCertificate的值之一或证书ServerCertificate的路径之一。 建议在证书中指定名称。

    下面是一个属性示例,这些属性定义了为可用性组正确配置的证书,其中该可用性组包含两个服务器,分别名为 test1.<your company>.comtest2.<your company>.com,以及一个名为 aglistener.<your company>.com 的可用性组侦听器。

    CN = <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager>
    DNS Name = aglistener.<your company>.com 
    DNS Name = test1.<your company>.com
    DNS Name = test2.<your company>.com
    DNS Name = aglistener
    DNS Name = test1
    DNS Name = test2
    
  • 方法 2:对可用性组的每个副本使用单独的证书。 使用单独的证书时,在生成证书后将副本添加到可用性组会更容易,因为只需为新副本生成证书,而不是修改所有现有副本上的所有证书。 公用名是任意的,因此可以是任何占位符值。 各 SQL Server 实例的主机名和完全限定域名(FQDN),以及可用性组侦听器的名称,必须 包含在各自副本证书的 使用者备用名称 中。 每个证书导入其相应的副本中,如果证书不是由公共或官方证书颁发机构(CA)签署,则将所有证书导入到所有连接到副本或可用性组侦听器的客户端的证书存储中。

    下面是定义名为test1.<your company>.comtest2.<your company>.com的两个实例的可用性组及名为aglistener.<your company>.com的可用性组侦听器,正确配置证书的属性示例:

    test1 上的证书:

    CN= <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager>
    DNS Name= test1.<your company>.com 
    DNS Name= aglistener.<your company>.com
    DNS Name= aglistener
    DNS Name= test1
    

    test2 上的证书:

    CN= <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager>
    DNS Name= test2.<your company>.com 
    DNS Name= aglistener.<your company>.com 
    DNS Name= aglistener
    DNS Name= test2 
    

故障转移群集实例

如果将 SQL Server 配置为 故障转移群集实例,则必须在故障转移群集中的所有节点上安装具有主机名的服务器证书或完全限定的 DNS 名称(FQDN)。 并且必须在故障转移群集的所有节点上预配证书。 例如,如果有一个两个节点群集,并且具有名为 virtsql 的节点test1.<your company>.comtest2.<your company>.com,并且有一个名为 virtsql 的虚拟服务器,则需要在两个节点上安装证书virtsql.<your company>.com

按照 配置 SQL Server 数据库引擎以加密连接中记录的顺序,将证书导入故障转移群集。

下面是为故障转移群集实例定义正确配置的证书的属性示例:

CN = virtsql.<your company>.com
DNS Name = virtsql.<your company>.com
DNS Name = virtsql

有关 SQL 群集的详细信息,请参阅 安装故障转移群集之前

检查证书是否符合要求

在 SQL Server 2019(15.x)及更高版本中,SQL Server Configuration Manager 会在配置阶段本身自动验证所有证书要求。 如果在配置证书后 SQL Server 成功启动,则表明 SQL Server 可以使用该证书。 但某些客户端应用程序可能仍对可用于加密的证书有其他要求,并且根据所使用的应用程序,可能会遇到不同的错误。 在这种情况下,需要检查客户端应用程序的支持文档,了解有关主题的详细信息。

可以使用下列方法之一来检查证书的有效性,以便与 SQL Server 一起使用:

  • sqlcheck 工具:是一种命令行工具, sqlcheck 用于检查当前计算机和服务帐户设置,并向控制台窗口生成文本报告,用于排查各种连接错误。 输出包含有关证书的以下信息:

    Details for SQL Server Instance: This Certificate row in this section provides more details regarding the certificate being used by SQL Server (Self-generated, hard-coded thumbprint value, etc.).
    
    Certificates in the Local Computer MY Store: This section shows detailed information regarding all the certificates found in the computer certificate store.
    

    有关该工具的功能和下载说明的详细信息,请参阅 欢迎使用 CSS_SQL_Networking_Tools wiki

  • certutil 工具certutil.exe 是作为证书服务的一部分安装的命令行程序。 可以使用 certutil.exe 来导出和显示证书信息。 使用此选项 -v 获取详细信息。 有关详细信息,请参阅 certutil

  • 证书管理单元:还可以使用 “证书”管理单元 窗口查看有关计算机上的各种证书存储中的证书的详细信息。 但此工具不显示 KeySpec 信息。 有关如何使用 MMC 管理单元查看证书的详细信息,请参阅 如何:使用 MMC 管理单元查看证书

将具有不同名称的证书导入主机名

当前,只有在证书的使用者名称与计算机的主机名匹配时,您才能使用 SQL Server Configuration Manager 导入证书。

如果要使用不同的主题名称的证书,请执行以下步骤:

  1. 使用 证书管理单元将证书导入本地计算机证书存储。

  2. 在 SQL Server Configuration Manager 中,展开 SQL Server 网络配置,右键单击 SQL Server 实例,然后选择“属性”以打开 针对 <instance_name> 的协议属性 对话框。

  3. 在“ 证书 ”选项卡上,从 “证书 ”下拉列表中选择已导入到证书存储的证书:

    SQL Server Configuration Manager 中“属性”对话框的“证书”选项卡的屏幕截图。

将具有不同名称的证书导入主机名会导致以下错误消息:

The selected certificate name does not match FQDN of this hostname. This property is required by SQL Server
Certificate name: random-name
Computer name: sqlserver.domain.com

过期证书

SQL Server 仅在配置时检查证书的有效性。 例如,不能在 SQL Server 2019 (15.x) 及更高版本上使用 SQL Server Configuration Manager 来预配过期的证书。 如果证书在预配后过期,SQL Server 将继续运行,而不会出现问题。 但是,某些客户端应用程序(如 Power BI)检查每个连接上的证书的有效性,如果 SQL Server 实例配置为使用过期的证书进行加密,则会引发错误。 建议不要将过期的证书用于 SQL Server 加密。

后续步骤