9.9. 使用基于证书的客户端身份验证

目录服务器支持 LDAP 客户端和服务器到服务器连接(如复制)的基于证书的验证。
根据配置,如果启用了基于证书的身份验证,客户端可以使用证书进行身份验证。验证证书后,服务器会根据证书的 subject 字段中的属性搜索目录中的用户。如果搜索准确返回一个用户条目,Directory 服务器会将此用户用于所有进一步的操作。另外,您可以配置用于身份验证的证书必须与存储在用户的 userCertificate 属性中的可辨识规则(DER)格式证书匹配。
使用基于证书的身份验证的好处:
  • 提高效率。当使用提示一次证书数据库密码的应用程序,然后将该证书用于所有后续绑定或身份验证操作时,它比持续提供绑定 DN 和密码效率更高。
  • 提高了安全性。使用基于证书的身份验证比非证书绑定操作更安全,因为基于证书的身份验证使用公钥加密。绑定凭证无法在网络间截获。如果证书或设备丢失,则无用时没有 PIN,因此第三方会干扰攻击。

9.9.1. 设置基于证书的身份验证

启用基于证书的身份验证:
  1. 启用加密的连接。详情请查看 第 9.4 节 “启用 TLS”
  2. 安装 CA 证书并为客户端和服务器连接设置信任选项。请参阅 第 9.3.2 节 “安装 CA 证书”
  3. 另外,还可验证 是否为 CA 证书设置了客户端和服务器的信任选项:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate get "Example-CA"
    Certificate Name: Example-CA
    Subject DN: CN=server.example.com,ST=Queensland,C=AU
    Issuer DN: CN=server.example.com,,ST=Queensland,C=AU
    Expires: 2021-05-09 10:57:54
    Trust Flags: CT,,
  4. 创建 /etc/dirsrv/slapd-instance_name/certmap.conf 文件,将信息从证书映射到目录服务器用户。例如:
    certmap default         default
    default:DNComps         dc
    default:FilterComps     mail,cn
    default:VerifyCert      on
    
    certmap example         o=Example Inc.,c=US
    example:DNComps
    这将配置为身份验证使用具有 o=Example Inc.,c=US issuer Distinguished Name (DN)的证书的用户,目录服务器不会从证书的主题生成基本 DN,因为 DNComps 参数为此签发者设置为空。另外,FilterCompsVerifyCert 的设置从默认条目继承。
    带有与指定的不同的签发者 DN 证书将使用来自默认条目的设置,并根据证书主题中的 cn 属性生成基本 DN。这可让 Directory 服务器在特定 DN 下启动搜索,而无需搜索整个目录。
    对于所有证书,Directory 服务器使用证书主题中的 mailcn 属性生成搜索过滤器。但是,如果主题中不存在 邮件,Directory 服务器将自动使用主题中的证书的 e 属性的值。
    有关可用参数的详情和描述,请参阅 Red Hat Directory Server Configuration、命令和文件参考 中的 certmap.conf 文件的描述。
  5. 启用客户端身份验证。例如,配置客户端身份验证是可选的:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-client-auth="allowed"
    或者,将 --tls-client-auth 参数设置为 required 来配置该客户端必须使用证书进行身份验证。
  6. 如果您启用了,身份验证证书必须与用户的 userCertificate 属性中存储的证书匹配,在 /etc/dirsrv/slapd-instance_name/certmap.conf 文件中设置 alias_name:VerifyCert on,将证书添加到用户条目中。请参阅 第 9.9.2 节 “向用户添加证书”

9.9.2. 向用户添加证书

设置基于证书的身份验证时,您可以设置用于身份验证的证书必须与用户的 userCertificate binary 属性中存储的证书匹配。如果您启用了这个功能,在 /etc/dirsrv/slapd-instance_name/certmap.conf 文件中设置了 alias_name:VerifyCert on,您必须将受影响用户的证书添加到其目录条目中。
重要
您必须将证书以 Distinguished Encoding Rules (DER)格式存储在 userCertificate 属性中。
将证书存储在用户的 userCertificate 属性中:
  1. 如果证书不是 DER 格式,请将其转换。例如:
    # openssl x509 -in /root/certificate.pem -out /root/certificate.der -outform DER
  2. 将证书添加到用户的 userCertificate 属性中。例如:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=user_name,ou=People,dc=example,dc=com
    changetype: modify
    add: userCertificate
    userCertificate:< file:///root/example.der
有关使用二进制属性的详情,请参考 第 3.1.8 节 “使用 Binary 属性”

9.9.3. 强制 EXTERNAL SASL 机制进行绑定请求

在 TLS 会话开始时,客户端将其证书发送到服务器。然后,它会发送其绑定请求。大多数客户端使用 EXTERNAL SASL 机制发出绑定请求,该机制表示目录服务器需要为绑定使用证书中的身份,而不是绑定请求中的凭据。
但是,如果客户端使用简单的身份验证或匿名凭证,则缺少此信息。在这种情况下,TLS 会话失败并显示无效凭证,即使证书中的证书和客户端身份有效。
要将目录服务器强制客户端使用 EXTERNAL SASL 机制,并忽略请求中的任何其他绑定方法:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-force-sasl-external=on
Successfully replaced "nsslapd-force-sasl-external"

9.9.4. 使用证书进行身份验证

要使用 OpenLDAP 客户端工具,对支持使用证书进行身份验证的目录服务器实例进行身份验证:
  1. 将以下环境变量设置为 CA 证书、用户密钥和用户证书的对应路径。例如:
    LDAPTLS_CACERT=/home/user_name/CA.crt
    LDAPTLS_KEY=/home/user_name/user.key
    LDAPTLS_CERT=/home/user_name/user.crt
    或者,在 ~/.ldaprc 文件中设置 TLS_CACERTTLS_KEYTLS_CERT 参数。详情请查看 ldap.conf(5) man page 中的 TLS OPTIONS 部分。
  2. 连接到服务器。例如:
    # ldapwhoami -H ldaps://server.example.com:636
如果您使用不同的客户端,请参阅相关客户端应用程序的文档了解如何使用基于证书的身份验证进行连接。