# 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
表现出类似的行为,这就是我陷入困境的方式)不同意。
我究竟做错了什么?
RHEL 实际上不提供任何可用作 CA 信任目的的“证书目录”。对于 OpenSSL,证书目录 - “CApath” - 是包含单个证书文件(PEM 格式或 OpenSSL 的扩展“可信证书”格式)的目录,其名称采用基于证书主题名称的哈希的特定格式。通常这是通过将具有人类可读名称和
.pem
扩展名的文件放在目录中并c_rehash
在其上运行来实现的(请参阅man c_rehash
). 对于 3.3.6 之后的 GnuTLS(在 GnuTLS 没有目录支持之前),它只是一个包含 PEM 文件的目录;GnuTLS 将尝试加载目录中的每个文件,并在任何 PEM-ish 上成功(它无法处理 OpenSSL 的“可信证书”格式)。老实说,我不确定 NSS 是否真的可以以某种方式使用一个充满单个证书文件的目录作为信任根,但 OpenLDAP 的文档似乎表明它可以(但如果该目录还包含一个 NSS 数据库,它将优先考虑)。无论如何,RHEL 没有像充满单个 CA 证书文件的目录那样的东西。Debian 及其衍生产品
/etc/ssl/certs
以这种格式提供;/etc/ssl/certs
是 Debian 上的规范信任存储位置,IMO 任何提供它的东西基本上都应该像 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
andkey3/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
as/etc/ssl/certs
is actually just a symlink to找到/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
/etc/ssl/certs/
包含/etc/ssl/certs/ca-bundle.trust.crt
作为 的一部分ca-certificates-2010.63-3.el6_1.5.noarch
,它是一个 Mozilla NSS 证书/密钥数据库。将此文件包含在其中TLS_CACERTDIR
会导致忽略所有其他文件。但是,
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
.其他人遇到这个;这就是我在 centos 6 openldap 和 sssd 上的工作方式:
注意事项:一些“聪明人”决定让 sssd 需要 TLS/SSL;centos5 的行为改变;这对外部系统非常有用;但是当内部设备上有 300 多个节点且内部网络无法访问机器集群时;这是极其无用的安全功能。
b. 此外,自签名证书似乎不再有效;会继续努力
C。不惜一切代价避免 NSLCD;当我设置遗留标志并使用而不是 sssd(网络组;死锁 syslog 等)时,遇到了不间断的问题。
使用 sssd 启动并运行;
sssd 配置文件
slapd配置文件
配置文件
这是一个很常见的问题,别担心,我有一个答案给你。
首先 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 证书将起作用。另请注意,如果配置文件位于 CAPS 中,则您正在 /etc/openldap/ldap.conf 中工作,它们是非常不同的文件。
希望这能解决问题。
根据我看过的每个手册页(但我不是 CentOS 用户),没有
LDAPTLS_CACERTDIR
. 要设置的正确变量是TLS_CACERTDIR
./etc/openldap/ldap.conf
您应该在 CentOS 保存 LDAP 库配置文件的地方或任何地方永久设置它。此外,您可能需要配置 pam-ldap 本身以查找 CA 证书。在 CentOS 中/etc/pam_ldap.conf
,我认为这是 ,要设置的变量是tls_cacertdir
。