9.4. 启用 TLS

目录服务器支持客户端和服务器之间的加密连接,以及复制环境中的服务器之间的加密连接。为此,目录服务器支持:
  • LDAPS 协议:在建立连接后直接使用 TLS 加密。
  • 通过 LDAP 协议的 STARTTLS 命令:连接是未加密的,直到客户端发送 STARTTLS 命令。
重要
为了安全起见,红帽建议启用 TLS 加密。
您可以使用绑定可辨识名称(DN)和密码或使用基于证书的验证,将 TLS 与简单的身份验证一起使用。
目录服务器的加密服务由 Mozilla Network Security Services (NSS)提供,它是一个 TLS 和基本加密函数库。NSS 包括一个基于软件的加密令牌,该令牌是联邦信息处理标准(FIPS) 140-2 认证。

9.4.1. 在目录服务器中启用 TLS

本节论述了如何在目录服务器中启用 TLS。

9.4.1.1. 使用命令行在目录服务器中启用 TLS

使用命令行启用 TLS:
  1. 请求并安装证书:
  2. 启用 TLS 并设置 LDAPS 端口:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-securePort=636 nsslapd-security=on
    Successfully replaced "nsslapd-securePort"
    Successfully replaced "nsslapd-security"
  3. 在 NSS 数据库中显示服务器证书的名称:
    # 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: ,,
    下一步需要 nickname。
  4. 要启用 RSA 密码系列,设置 NSS 数据库安全设备以及服务器证书名称:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
    注意
    默认情况下,NSS 数据库中的安全设备名称是 内部(软件)。
  5. (可选)更新目录服务器支持的密码列表。详情请查看 第 9.4.1.3.2 节 “使用命令行显示和设置目录服务器使用的加密”
  6. (可选)启用基于证书的身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”
  7. (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”
  8. 重启 Directory 服务器实例:
    # dsctl instance_name restart
    如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”

9.4.1.2. 使用 Web 控制台在目录服务器中启用 TLS

使用 Web 控制台在 Directory Server 中启用 TLS:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 导入证书颁发机构(CA)证书。请参阅 第 9.3.2.2 节 “使用 Web 控制台安装 CA 证书”
  4. 导入 CA 发布的服务器证书。请参阅 第 9.3.4.2 节 “使用 Web 控制台安装服务器证书”
  5. 打开 Server Settings 菜单,然后选择 Security 条目。
  6. Security Configuration 选项卡中:
    1. 单击 Security Enabled
    2. Server Certificate Name 字段中选择证书的 nickname。
    3. (可选)更改服务器应该支持的最小和最大 TLS 版本的设置。
    4. (可选)配置客户端身份验证,以便用户使用证书进行身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”
  7. 单击 Save Configuration
  8. (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”
  9. 如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”

9.4.1.3. 设置加密加密

目录服务器支持不同的密码,您可以启用或禁用它们。密码是加密中使用的算法。当客户端启动与服务器的 TLS 连接时,客户端会告知服务器首选加密信息的密码。如果服务器支持至少一个密码,可以使用这个算法建立加密的连接。
如果您根据 第 9.4 节 “启用 TLS” 启用加密,您可以显示和更新密码目录服务器。
9.4.1.3.1. 显示默认加密
如果在 cn=encryption,cn=config 条目中没有设置 nsSSL3Ciphers 参数,目录服务器将使用网络安全服务(NSS)的默认密码。显示默认密码:
# /usr/lib64/nss/unsupported-tools/listsuites | grep -B1 --no-group-separator "Enabled"         
TLS_AES_128_GCM_SHA256:
  0x1301 TLS 1.3 TLS 1.3 AES-GCM  128 AEAD   Enabled  FIPS Domestic            
TLS_CHACHA20_POLY1305_SHA256:
  0x1303 TLS 1.3 TLS 1.3 CHACHA20POLY1305 256 AEAD   Enabled       Domestic
...
9.4.1.3.2. 使用命令行显示和设置目录服务器使用的加密

显示所有可用的加密

显示目录服务器中所有可用密码的列表:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --supported
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
...
这只是您可以启用或禁用的可用密码列表。该列表不显示当前使用的密码目录服务器。

显示加密目录服务器使用

要显示当前使用的密码目录服务器,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --enabled
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
...
另外,您还可以显示要启用和禁用的密码:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list
default
+tls_rsa_aes_128_sha
+tls_rsa_aes_256_sha
...
default 关键字引用 NSS 提供的首选默认密码。请参阅 第 9.4.1.3.1 节 “显示默认加密”
重要
目录服务器使用 nsSSL3Ciphers 属性中的设置来生成实际使用的密码列表。但是,如果您在 nsSSL3Ciphers 中启用了弱密码,但将 allowWeakCiphers 参数设置为 off,则目录服务器只使用强大的密码,并在 nsSSLSupportedCiphers read-only 属性中显示它们。

更新已启用的加密列表

更新启用的密码列表:
  1. 显示当前启用的密码列表。请参阅 “显示加密目录服务器使用”一节
  2. 要只启用特定的密码,请更新 nsSSL3Ciphers 属性。例如,只启用 TLS_RSA_WITH_AES_128_GCM_SHA256 密码:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers set "-all,+TLS_RSA_WITH_AES_128_GCM_SHA256"
  3. 重启 Directory 服务器实例:
    # dsctl instance_name restart
  4. (可选)显示已启用的密码列表以验证结果。请参阅 “显示加密目录服务器使用”一节
9.4.1.3.3. 使用 Web 控制台显示和设置目录服务器使用的加密
使用 Web 控制台选择和更新密码:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. Cipher Preferences 选项卡中,Directory 服务器显示当前启用的密码。
  5. 如果您使用不同于默认密码,请在 Ciphers Suite 字段中选择 Default Ciphers 来自动启用默认密码。详情请查看 第 9.4.1.3.1 节 “显示默认加密”
    或者,您可以将 Ciphers Suite 设置为:
    • 所有 Ciphers 启用所有密码。另外,还可在 Deny Specific Ciphers 字段中禁用特定的密码。
    • 没有 Ciphers 禁用所有密码。另外,还可在 Allow Specific Ciphers 字段中启用特定的密码。
  6. 单击 Save Cipher Preferences
  7. 如果您更新了密码列表,请重新启动 Directory 服务器实例。请查看 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”

9.4.1.4. 启动目录服务器没有密码文件

如果您在启用了加密的情况下启动目录服务器,并在 NSS 数据库中设置密码:
  • 如果 systemctl 命令启动 ns-slapd Directory Server 进程,systemd 会提示输入密码,并自动将输入传递给 systemd-tty-ask-password-agent 工具。例如:
    # systemctl start dirsrv@instance_name
    Enter PIN for Internal (Software) Token:
  • 在个别情况下,当 ns-slapd Directory Server 进程不是由 systemctl 工具启动且从终端分离时,会使用 wall 命令向所有终端发送一条消息。例如:
    Broadcast message from root@server (Fri 2017-01-01 06:00:00 CET):
    
    Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234).
    Please enter password with the systemd-tty-ask-password-agent tool!
    要输入密码,请运行:
    # systemd-tty-ask-password-agent
    Enter PIN for Internal (Software) Token:

9.4.1.5. 为目录服务器创建密码文件

如果启用了加密并在 NSS 数据库上设置的密码,则目录服务器会在服务启动时提示输入此密码。请参阅 第 9.4.1.4 节 “启动目录服务器没有密码文件”
要绕过此提示,您可以在 /etc/dirsrv/slapd-instance_name/pin.txt 文件中存储 NSS 数据库密码。这可让目录服务器在不提示输入这个密码的情况下,自动启动。
警告
密码以明文形式保存。如果服务器在不安全的环境中运行,则不要使用密码文件。
创建密码文件:
  1. 使用以下内容创建 /etc/dirsrv/slapd-instance_name/pin.txt 文件:
    • 如果您使用 NSS 软件加密模块,这是默认设置:
      Internal (Software) Token:password
    • 如果您使用硬件安全模块(HSM):
      name_of_the_token:password
  2. 设置权限:
    # chown dirsrv:dirsrv /etc/dirsrv/slapd-instance_name/pin.txt
    # chmod 400 /etc/dirsrv/slapd-instance_name/pin.txt

9.4.1.6. 管理目录服务器在证书过期时如何获得

默认情况下,如果启用了加密且证书已过期,Directory 服务器会记录警告并启动服务。要更改此行为,请设置 nsslapd-validate-cert 参数。您可以将其设置为以下值:
  • 警告 :目录服务器实例启动并记录有关过期证书的警告到 /var/log/dirsrv/slapd-instance_name/error 日志文件。这是默认的设置。
  • 在 上 :目录服务器验证证书,如果证书已过期,实例无法启动。
  • off :目录服务器不会验证证书过期日期。实例启动且没有记录警告。

例 9.3. 如果证书已过期,防止目录服务器启动

要防止 Directory 服务器在证书已过期时启动:
  1. nsslapd-validate-cert 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-validate-cert=on
    Successfully replaced "nsslapd-validate-cert"
  2. 重启 Directory 服务器实例:
    # dsctl instance_name restart

9.4.2. 将目录服务器使用的 CA 证书添加到 Red Hat Enterprise Linux 的信任存储中

当您在 Directory 服务器中启用 TLS 加密时,您要将实例配置为使用 CA 发布的证书。如果客户端现在使用 LDAPS 协议或 LDAP 的 STARTTLS 命令建立连接,目录服务器使用这个证书来加密连接。客户端实用程序使用 CA 证书来验证服务器证书是否有效。默认情况下,如果这些工具不信任服务器证书,则取消连接。

例 9.4. 如果客户端工具不使用 CA 证书,则可能的连接错误

如果客户端实用程序不使用 CA 证书,则工具在使用 TLS 加密时无法验证服务器的证书。因此,到服务器的连接会失败。例如:
  • dsconf
    # dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get
    Error: {'desc': "Can't contact LDAP server", 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (self signed certificate in certificate chain)'}
  • ldapsearch
    # ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x
    Enter LDAP Password: 
    ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
要在 Red Hat Enterprise Linux 中启用客户端工具来验证目录服务器使用的证书,请将 CA 证书添加到操作系统的信任存储中:
  1. 如果您没有目录服务器使用的 CA 证书的本地副本:
    1. 列出服务器的 NSS 数据库中的证书:
      # certutil -d /etc/dirsrv/slapd-instance_name/ -L
      
      Certificate Nickname                       Trust Attributes
                                                 SSL,S/MIME,JAR/XPI
      
      Example CA                                 C,,  
      Server-Cert                                u,u,u
    2. 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
      # certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
  2. 将 CA 证书复制到 /etc/pki/ca-trust/source/anchors/ 目录中。例如:
    # cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
  3. 重建 CA 信任数据库:
    # update-ca-trust