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:
- 请求并安装证书:
- 对于证书颁发机构(CA)发布的证书:
- 创建证书签名请求(CSR)。请查看 第 9.3.1.1 节 “使用命令行创建证书签名请求”
- 导入 CA 证书。请参阅 第 9.3.2.1 节 “使用命令行安装 CA 证书”。
- 导入 CA 发布的服务器证书。请参阅 第 9.3.4.1 节 “使用命令行安装服务器证书”。
- 有关自签名证书,请参阅 第 9.3.5 节 “生成并安装自签名证书”。
- 启用 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"
- 在 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。 - 要启用 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 数据库中的安全设备名称是 内部(软件)。 - (可选)更新目录服务器支持的密码列表。详情请查看 第 9.4.1.3.2 节 “使用命令行显示和设置目录服务器使用的加密”。
- (可选)启用基于证书的身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”。
- (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”。
- 重启 Directory 服务器实例:
# dsctl instance_name restart
如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”。
9.4.1.2. 使用 Web 控制台在目录服务器中启用 TLS
使用 Web 控制台在 Directory Server 中启用 TLS:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 创建 CSR。请参阅 第 9.3.1 节 “创建证书签名请求”。
- 导入证书颁发机构(CA)证书。请参阅 第 9.3.2.2 节 “使用 Web 控制台安装 CA 证书”。
- 导入 CA 发布的服务器证书。请参阅 第 9.3.4.2 节 “使用 Web 控制台安装服务器证书”。
- 打开 Security 条目。菜单,然后选择
- 在 Security Configuration 选项卡中:
- 单击 Security Enabled。
- 在 Server Certificate Name 字段中选择证书的 nickname。
- (可选)更改服务器应该支持的最小和最大 TLS 版本的设置。
- (可选)配置客户端身份验证,以便用户使用证书进行身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”。
- 单击。
- (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”。
- 重启 Directory 服务器实例。请查看 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”如果您在 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 属性中显示它们。
更新已启用的加密列表
更新启用的密码列表:
- 显示当前启用的密码列表。请参阅 “显示加密目录服务器使用”一节。
- 要只启用特定的密码,请更新
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"
- 重启 Directory 服务器实例:
# dsctl instance_name restart
- (可选)显示已启用的密码列表以验证结果。请参阅 “显示加密目录服务器使用”一节。
9.4.1.3.3. 使用 Web 控制台显示和设置目录服务器使用的加密
使用 Web 控制台选择和更新密码:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 在 Cipher Preferences 选项卡中,Directory 服务器显示当前启用的密码。
- 或者,您可以将 Ciphers Suite 设置为:
- 所有 Ciphers 启用所有密码。另外,还可在 Deny Specific Ciphers 字段中禁用特定的密码。
- 没有 Ciphers 禁用所有密码。另外,还可在 Allow Specific Ciphers 字段中启用特定的密码。
- 单击。
- 如果您更新了密码列表,请重新启动 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 数据库密码。这可让目录服务器在不提示输入这个密码的情况下,自动启动。
警告
密码以明文形式保存。如果服务器在不安全的环境中运行,则不要使用密码文件。
创建密码文件:
- 使用以下内容创建
/etc/dirsrv/slapd-instance_name/pin.txt
文件:- 如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
- 如果您使用硬件安全模块(HSM):
name_of_the_token:password
- 设置权限:
# 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 服务器在证书已过期时启动:
- 将
nsslapd-validate-cert
参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-validate-cert=on Successfully replaced "nsslapd-validate-cert"
- 重启 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 证书添加到操作系统的信任存储中:
- 如果您没有目录服务器使用的 CA 证书的本地副本:
- 列出服务器的 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
- 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
# certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
- 将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/
目录中。例如:# cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
- 重建 CA 信任数据库:
# update-ca-trust