9.3. 管理目录服务器使用的 NSS 数据库

要使用 TLS 加密或基于证书的身份验证,您必须在网络安全服务(NSS)数据库中管理证书。当您创建实例时,dscreate 实用程序会在 /etc/dirsrv/slapd-instance_name/ 目录中自动创建此数据库,并使用强大的密码保护。实用程序将密码存储在 /etc/dirsrv/slapd-instance_name/pwdfile.txt 文件中。请注意,Directory 服务器不使用此文件。dscreate 实用程序仅创建此文件来为管理员提供密码。有关更改密码的详情,请参考 第 9.3.10 节 “更改 NSS 数据库的密码”
这部分论述了管理目录服务器的 NSS 数据库的最频繁操作。

9.3.1. 创建证书签名请求

证书签名请求(CSR)是对证书颁发机构(CA)为服务器密钥签名的请求。这部分论述了如何创建包含私钥的 CSR。
注意
目录服务器只支持使用 certutil 工具直接在 NSS 数据库中创建私钥和 CSR。

9.3.1.1. 使用命令行创建证书签名请求

要创建密钥和 CSR,请使用 dsctl tls generate-server-cert-csr 命令:
# dsctl instance_name tls generate-server-cert-csr -s "certificate_subject"
dsctl tls generate-server-cert-csr 命令将 CSR 存储在 /etc/dirsrv/slapd-instance_name/Server-Cert.csr 文件中,以及目录服务器的网络安全服务(NSS)数据库中的私钥。

例 9.1. 为单一主机名创建私钥和 CSR

以下命令为 server.example.com 主机生成位私钥:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US"
-s 参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。CN 字段是必需的,您必须将其设置为服务器的完全限定域名(FQDN)。其他字段都是可选的。

例 9.2. 为多主目录主机创建私钥和 CSR

如果目录服务器主机有多个名称,请使用 CSR 的 SAN 扩展中的所有主机名创建一个 CSR。以下命令为 server.example.comserver.example.net 主机名生成位私钥和 CSR:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US" server.example.com server.example.net
如果将主机名指定为最后一个参数,该命令会使用 DNS:server.example.com 添加 SAN 扩展,DNS:server.example.net 条目添加到 CSR。-s 参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。CN 字段是必需的,您必须将其设置为服务器的 FQDN 之一。其他字段都是可选的。
生成 CSR 后,将其提交到 CA 以获取签发的证书。详情请查看您的 CA 文档。

9.3.2. 安装 CA 证书

要启用目录服务器信任证书颁发机构(CA),您必须将 CA 的证书安装到网络安全服务(NSS)数据库中。在此过程中,您必须设置 CA 发布的证书应被信任:

表 9.1. CA Trust Options

Web 控制台选项 dsconfcertutil 选项 描述
(C)受信任的 CA C,, 服务器验证用于建立与复制合作伙伴的加密连接的证书是否已由可信 CA 发布。
(T)受信任的 CA 客户端身份验证 T, 服务器信任此 CA 证书来发布适合 TLS EXTERNAL 绑定的客户端证书。
您可以为 CA 设置这两个选项。使用 certutil 时,将 -T "CT," 参数传给实用程序。

9.3.2.1. 使用命令行安装 CA 证书

安装 CA 证书:
  1. 导入 CA 证书。例如,要导入存储在 /root/ca.crt 文件中的 CA 证书,并使用 Example CA nick 名称将其存储在数据库中:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  2. 设置信任选项。例如,要设置 CT, 信任标志:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

9.3.2.2. 使用 Web 控制台安装 CA 证书

使用 Web 控制台安装 CA 证书:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡,然后选择 受信任的证书颁发机构 子选项卡。
  5. Add CA Certificate
  6. 输入 CA 证书文件的路径以及证书的别名。

    图 9.1. 添加 CA 证书

    添加 CA 证书
    注意
    CA 证书必须存储在本地目录服务器主机上,且必须由 dirsrv 用户读取。
  7. 单击 Add Certificate
  8. 单击导入的 CA 证书旁边的 Actions,然后选择 Edit Trust Flags
  9. SSL 列中选择 (C) - Trusted CA(T) - Trusted CA Client Auth

    图 9.2. 添加 CA 证书的信任标记

    添加 CA 证书的信任标记

9.3.3. 导入私钥和服务器证书

这部分论述了如何使用外部工具在 NSS 数据库中导入私钥和证书签名请求(CSR)。
如果您在 NSS 数据库中创建了私钥和 CSR,请按照 第 9.3.4 节 “安装服务器证书” 中所述的步骤操作。
要从 /root/server.crt/root/server.key 文件中的私钥导入证书,请输入:
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
请注意,dsctl tls import-server-key-cert 命令需要按照以下顺序的路径:
  1. 服务器证书的路径。
  2. 私钥文件的路径。

9.3.4. 安装服务器证书

在证书颁发机构(CA)发布请求的证书后,您必须在网络安全服务(NSS)数据库中安装它。
如果您创建了不在 NSS 数据库中的私钥和证书签名请求,请按照 中所述的步骤操作 第 9.3.3 节 “导入私钥和服务器证书”

9.3.4.1. 使用命令行安装服务器证书

要在目录服务器的 NSS 数据库中安装服务器证书,请使用 certutil 工具。例如:
  1. 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”
  2. 导入服务器证书。例如,要导入存储在 /root/instance_name.crt 文件中的证书,并将其设置为实例使用的主证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "Server-Cert" --primary-cert

9.3.4.2. 使用 Web 控制台安装服务器证书

使用 Web 控制台安装服务器证书:
  1. 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Server Settings 菜单,然后选择 Security 条目。
  5. 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
  6. 单击 Add Server Certificate
  7. 输入服务器证书文件的路径以及证书的别名。

    图 9.3. 添加服务器证书

    添加服务器证书
    注意
    服务器证书必须存储在本地目录服务器主机上,且必须由 dirsrv 用户读取。
  8. 单击 Add Certificate

9.3.5. 生成并安装自签名证书

当您使用 dscreate 实用程序创建启用了 TLS 的实例时,dscreate 会自动创建并安装自签名证书。但是,如果您在实例创建过程中没有启用 TLS,您可以手动创建并安装自签名证书。
注意
您只能使用命令行执行此操作。
创建并安装自签名证书:
  1. 使用随机数据生成 noise 文件。例如,要生成大小为 4096 位的文件:
    # openssl rand -out /tmp/noise.bin 4096
  2. 创建自签名证书并将其添加到 NSS 数据库中:
    # certutil -S -x -d /etc/dirsrv/slapd-instance_name/ -z /tmp/noise.bin \
         -n "Server-Cert" -s "CN=$HOSTNAME" -t "CT,C,C" -m $RANDOM \
         --keyUsage digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
    Red Hat Enterprise Linux 会自动将 $HOSTNAME 变量替换为完全限定域名(FQDN),将 $RANDOM 替换为随机生成的数字。有关上一命令中使用的参数的详情,请查看 certutil(1) man page。
  3. (可选)验证生成的证书是自签名的:
    # certutil -L -d /etc/dirsrv/slapd-instance_name/ -n "Server-Cert" | egrep "Issuer|Subject"
            Issuer: "CN=server.example.com"
            Subject: "CN=server.example.com"
    此命令的输出必须同时显示证书的签发者和主题的目录服务器主机的 FQDN。

9.3.6. 续订证书

如果证书将在不久的将来过期,您必须及时续订证书,以继续建立安全连接。

9.3.6.1. 使用命令行续订证书

续订服务器证书:
  • 如果不使用属性加密:
    1. 创建一个新的证书签名请求(CSR),其选项相同,如密钥大小、主机名和主题。有关创建 CSR 的详情,请参考 第 9.3.1.1 节 “使用命令行创建证书签名请求”
    2. 从 CA 收到发布的证书后,使用相同的 nickname 在数据库中安装证书。请参阅 第 9.3.2.1 节 “使用命令行安装 CA 证书”
    3. 停止实例:
      # dsctl instance_name stop
    4. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件并删除以下条目,包括其属性:
      • cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
      • cn=3DES,cn=encrypted 属性键,cn=database_name,cn=ldbm database,cn=plugins,cn=config
      重要
      删除所有数据库的条目。如果包含 nsSymmetricKey 属性的任何条目保留在 /etc/dirsrv/slapd-instance_name/dse.ldif 文件中,则目录服务器将无法启动。
    5. 启动实例:
      # dsctl instance_name start
    目录服务器将自动使用较新的发布的证书。
  • 如果使用属性加密,请参阅 第 10.5 节 “更新用于属性加密的 TLS 证书”

9.3.7. 删除证书

如果不再需要证书,例如,由于已公开了证书,请将其从数据库中删除。

9.3.7.1. 使用命令行删除证书

使用命令行删除证书:
  1. 另外,还可在数据库中显示证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate list
    
    Certificate Name: Server-Cert
    Subject DN: CN=server.example.com
    Issuer DN: CN=Example CA
    Expires: 2022-07-29 11:10:14
    Trust Flags: ,,
  2. 删除证书。例如,使用 Server-Cert nickname 删除证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate del Server-Cert

9.3.7.2. 使用 Web 控制台删除证书

使用 Web 控制台删除证书:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
  5. 单击证书旁边的 Actions,然后选择 Delete Certificate
  6. 单击 Yes

9.3.8. 删除私钥

如果不再需要私钥,例如,因为您创建了更强大的密钥,将其从数据库中删除。
警告
如果您删除了私钥,基于此密钥的证书将无法正常工作。

9.3.8.1. 使用命令行删除私钥

删除私钥:
  1. 根据您要删除的密钥删除所有证书。请参阅 第 9.3.7 节 “删除证书”
  2. 另外,还可在数据库中显示密钥:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -K
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    < 0> rsa      7a2fb6c269d83c4036eac7e4edb6aaf2ed08bc4a   Server-Cert
    < 1> rsa      662b826aa3dd4ca7fd7e6883558cf3866c42f4e2   example-cert
  3. 删除私钥。例如,使用 example-cert 别名删除私钥:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -F -n "example-cert"

9.3.9. 更改 CA Trust Options

在某些情况下,您需要更新证书颁发机构(CA)的 trust 选项。本节描述了这个步骤。

9.3.9.1. 使用命令行更改 CA 信任选项

要更改 CA 的信任选项,请将 --flags 参数中的新选项传给 dsconf 安全 ca-certificate set-trust-flags 命令。
例如,要设置目录服务器只信任由名为 example-CA 的 CA 发布的客户端身份验证证书:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "example-CA" --flags "T,,"
--flags trust_options 参数设置 CA 发布的证书应被信任。请参阅 表 9.1 “CA Trust Options”

9.3.9.2. 使用 Web 控制台更改 CA 信任选项

使用 Web 控制台更改 CA 的信任选项:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡。
  5. 受信任的证书颁发机构 子选项卡上,单击导入的 CA 证书旁边的 Actions,然后选择 Edit Trust Flags
  6. 选择 trust 标记。例如:

    图 9.4. 设置 CA 证书的信任标记

    设置 CA 证书的信任标记
  7. 点击 Save

9.3.10. 更改 NSS 数据库的密码

在某些情况下,管理员想要更改网络安全服务(NSS)数据库的密码。本节描述了此过程。
重要
如果您使用密码文件启用目录服务器自动打开网络安全服务(NSS)数据库,您必须在设置密码后更新该文件。请参阅 第 9.4.1.5 节 “为目录服务器创建密码文件”

9.3.10.1. 使用命令行更改 NSS 数据库的密码

更改 NSS 数据库的密码:
# certutil -d /etc/dirsrv/slapd-instance_name -W
Enter Password or Pin for "NSS Certificate DB":
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password: 
Re-enter password: 
Password changed successfully.