CentOS的openLDAP证书信任问题

# 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_ldapperformance出类似的行为,这是我如何得到这个混乱)不同意。
我究竟做错了什么?

事实上,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了解为什么它首先存在的一些背景,以及我怎么试图让它固定)&#x3002; 所以我认为你说的是​​正确的,但是错误的原因。 OpenLDAP没有做错任何事,因为“ca-bundle.trust.crt …是Mozilla NSS证书/密钥数据库”(称为cert8/9.dbkey3/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只用于查询 ,所以ldapsearchldapmodifyldapremove ,它真的是你的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启动并运行;

  1. 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 
  2. 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 
  3. 的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