# LDAPTLS_CACERTDIR=/etc/ssl/certs/ ldapwhoami -x -ZZ -H ldaps://ldap.domain.tld
ldap_start_tls: Can't contact LDAP server (-1)
additional info: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.
# openssl s_client -connect ldap.domain.tld:636 -CApath /etc/ssl/certs
<... successful tls negotiation stuff ...>
Compression: 1 (zlib compression)
Start Time: 1349994779
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
openssl
似乎认为证书没有问题,但是openldap
的库(pam_ldap
表现出类似的行为,这就是我陷入这种困境的原因)不同意。
我做错了什么?
答案1
实际上,RHEL 并未提供任何可用作 CA 信任目的的“证书目录”的内容。对于 OpenSSL,证书目录 - “CApath” - 是一个包含单个证书文件(PEM 格式或 OpenSSL 的扩展“受信任证书”格式)的目录,其名称采用基于证书主题名称哈希值的特定格式。通常,这是通过将具有人性化名称和.pem
扩展名的文件放在目录中并c_rehash
在其上运行来实现的(请参阅man c_rehash
)。对于 3.3.6 版以后的 GnuTLS(在此之前,GnuTLS 不支持目录),它只是一个包含 PEM 文件的目录;GnuTLS 将尝试加载目录中的每个文件,并成功加载任何 PEM 格式的文件(它无法处理 OpenSSL 的“受信任证书”格式)。我不确定 NSS 是否真的可以以某种方式使用一个包含单个证书文件的目录作为信任根,但 OpenLDAP 的文档似乎表明它可以(但如果目录还包含 NSS 数据库,它将优先考虑该数据库)。无论如何,RHEL 没有任何类似于包含单独 CA 证书文件的目录。
Debian 及其衍生产品/etc/ssl/certs
以这种格式提供;/etc/ssl/certs
是 Debian 上的规范信任存储位置,在我看来,提供它的任何产品都应该基本上像 Debian 那样布局,因为 Debian 的目录自 1999 年以来就以或多或少相同的方式布局。RHEL 有一个/etc/ssl/certs
目录,但它不是这种格式 - 它根本不包含任何单独的证书文件。您不能将其用作 CApath。老实说,在 RHEL(以及 Fedora 和衍生产品)上,该目录基本上是一个陷阱。不要使用它。(见https://bugzilla.redhat.com/show_bug.cgi?id=572725和https://bugzilla.redhat.com/show_bug.cgi?id=1053882了解它存在的原因以及我如何尝试修复它)。所以我认为你对发生的事情的看法是正确的,但对原因的看法是错误的。OpenLDAP 没有做错任何事,它失败的原因不是因为“ca-bundle.trust.crt...是一个 Mozilla NSS 证书/密钥数据库”(它们被称为cert8/9.db
和key3/4.db
,RHEL 上的系统范围的证书/密钥数据库位于/etc/pki/nssdb
),它失败的原因只是因为/etc/ssl/certs
它根本不能用作“证书目录”。
RHEL 也没有提供任何可用作 CApath 样式信任存储的东西。RHEL 的系统信任存储以单个 PEM 捆绑文件(OpenSSL 术语中的“CAfile”)的形式提供,可在 和 找到/etc/pki/tls/certs/ca-bundle.crt
。/etc/pki/tls/cert.pem
它也可以在 找到,/etc/ssl/certs/ca-bundle.crt
因为/etc/ssl/certs
它实际上只是 的符号链接/etc/pki/tls/certs
,但该位置不是规范的,实际上不应该被任何东西使用。RHEL 还以 OpenSSL 的“受信任证书”格式提供了一个捆绑包,即/etc/pki/tls/certs/ca-bundle.trust.crt
。
正如您所想,正确的做法是使用系统提供的捆绑文件。您的答案是可行的,但出于上述原因,我强烈建议使用TLS_CACERT=/etc/pki/tls/certs/ca-bundle.crt
或 而TLS_CACERT=/etc/pki/tls/cert.pem
不是TLS_CACERT=/etc/ssl/certs/ca-bundle.crt
。
(顺便说一句,这些都不是新鲜事,但互联网上普遍存在混淆。RH 及其衍生产品从未提供过一个充满证书的目录。他们从 2000 年开始提供一个捆绑文件。它在 2005 年从 /usr/share/ssl 移至 /etc/pki/tls。Debian 自石器时代以来就一直将两者作为/etc/ssl/certs
CApath 样式的目录和捆绑文件。)/etc/ssl/certs/ca-certificates.crt
答案2
/etc/ssl/certs/
包含/etc/ssl/certs/ca-bundle.trust.crt
为 的一部分ca-certificates-2010.63-3.el6_1.5.noarch
,它是 Mozilla NSS 证书/密钥数据库。包含此文件TLS_CACERTDIR
会导致忽略所有其他文件。
TLS_CACERTDIR
指定包含证书颁发机构证书(位于单独的文件中)的目录的路径。TLS_CACERT 始终在 TLS_CACERTDIR 之前使用。`GnuTLS 会忽略此参数。使用 Mozilla NSS 时,可能包含 Mozilla NSS 证书/密钥数据库。如果包含 Mozilla NSS 证书/密钥数据库和 CA 证书文件,OpenLDAP 将使用证书/密钥数据库并忽略 CA 证书文件。`
但是,openldap-2.4.23-26.el6_3.2.i686
似乎没有正确处理这个问题。
简短答案
使用LDAPTLS_CACERT=/etc/ssl/certs/ca-bundle.crt
(配置文件TLS_CACERT=/etc/ssl/certs/ca-bundle.crt
)
此文件也包含在内ca-certificates-2010.63-3.el6_1.5.noarch
。
答案3
这是一个非常常见的问题,不要担心,我会为您解答。
第一个 RHEL 克隆有两个ldap.conf
文件,
/etc/ldap.conf
或者在 RHEL6 中已弃用,但您可以/etc/nslcd.conf
使用验证现在
/etc/openldap/ldap.conf
只为查询,所以,,,ldapsearch
它实际上是您的配置文件,因此您不必每次运行 ldap 命令时都输入令人讨厌的长字符串。ldapmodify
ldapremove
现在有了这些,你就有了两个参数,
tls_cacertfile
- 明确定义 CA 证书,一切就绪tls_cacertdir
- 将 ca 证书放入目录中,但它不起作用,因为它需求被散列...
使用openssl x509 -hash -noout -in $file , ln -s $file $file.0
,那么您的CA证书将会起作用。
还笔记如果配置文件是大写的,则您正在 /etc/openldap/ldap.conf 中工作,它们是非常不同的文件。
希望这能澄清一切。
答案4
根据我看过的每个手册页(但我不是 CentOS 用户),没有 这样的变量LDAPTLS_CACERTDIR
。要设置的正确变量是TLS_CACERTDIR
。您应该在/etc/openldap/ldap.conf
CentOS 保存 LDAP 库配置文件的地方或任何地方永久设置它。此外,您可能需要配置 pam-ldap 本身来查找 CA 证书。/etc/pam_ldap.conf
我认为在 CentOS 中这是 ,要设置的变量是tls_cacertdir
。