# 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
performance出类似的行为,这是我如何得到这个混乱)不同意。
我究竟做错了什么?
事实上,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's那样基本上放置它,因为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
中find,因为/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
通过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
作为一个bundle文件或多或less自石器时代。)
/etc/ssl/certs/
contains /etc/ssl/certs/ca-bundle.trust.crt
作为ca-certificates-2010.63-3.el6_1.5.noarch
,它是一个Mozilla NSS证书/密钥数据库。 将此文件包含在TLS_CACERTDIR
会导致忽略所有其他文件。
TLS_CACERTDIR
指定在单独的单个文件中包含证书颁发机构证书的目录的path。 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
(configuration文件TLS_CACERT=/etc/ssl/certs/ca-bundle.crt
)
这个文件也包含在ca-certificates-2010.63-3.el6_1.5.noarch
。
这是一个非常普遍的问题,不要担心,我有一个答案给你。
第一个RHEL克隆有两个ldap.conf
文件,/ /etc/ldap.conf
/ ldap.conf
或者在RHEL6中被弃用,但是你可以使用/etc/nslcd.conf
进行身份validation现在/etc/openldap/ldap.conf
只用于查询 ,所以ldapsearch
, ldapmodify
, ldapremove
,它真的是你的configuration文件,所以你不必在每次你想运行一个ldap命令时都有一个讨厌的长string。
现在用这个方法,你有两个参数,
tls_cacertfile
– 明确定义ca cert,你应该很好走 tls_cacertdir
– 将ca cert放入目录中,但不起作用,因为它需要被哈希… 使用openssl x509 -hash -noout -in $file , ln -s $file $file.0
,那么你的CA证书将会起作用。
还要注意,如果configuration文件是CAPS,你在/etc/openldap/ldap.conf中工作,它们是非常不同的文件。
希望这清除了事情。
任何人碰到这个; 这是什么为我工作在centos 6 openldap和sssd:
笔记:a。 一些“聪明人”决定让sssd需要TLS / SSL; 行为从centos5变化; 这对于外部系统是很好的; 但是如果内部设备上有300多个节点,并且机器群集的内部networking不可达, 这是非常无用的安全function。
湾 此外,自签证书似乎不再工作了, 将继续尝试
C。 不惜一切代价避免NSLCD; 当我设置遗留标志,而不是使用sssd(netgroups;死锁系统日志等)时,我遇到了不停的问题。
使用sssd启动并运行;
sssd.conf
[domain/default] ldap_id_use_start_tls = True id_provider = ldap auth_provider = ldap chpass_provider = ldap cache_credentials = True ldap_search_base = dc=local enumerate = True ldap_uri = ldap://192.168.1.2/ ldap_tls_cacertdir = /etc/openldap/cacerts ldap_tls_reqcert = allow ldap_schema = rfc2307bis
slapd.conf中
TLSCACertificateFile /etc/openldap/cacerts/ca-bundle.crt TLSCertificateFile /etc/openldap/cacerts/slapd.pem TLSCertificateKeyFile /etc/openldap/cacerts/slapd.pem TLSCipherSuite HIGH:MEDIUM:-SSLv2
的ldap.conf
URI ldap://192.168.1.2/ BASE dc=local TLS_CACERTDIR /etc/openldap/cacerts
根据我见过的每一个手册页(但我不是一个CentOS用户),没有像LDAPTLS_CACERTDIR
这样的事情。 要设置的正确variables是TLS_CACERTDIR
。 您应该在/etc/openldap/ldap.conf
或CentOS保存LDAP库configuration文件的地方永久性地设置它。 另外,您可能需要configurationpam-ldap本身来查找CA证书。 在CentOS中,我认为是/etc/pam_ldap.conf
,要设置的variables是tls_cacertdir
。