CentOS openLDAP证书信任问题


12
# 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表现出类似的行为,这就是我陷入困境的方式)不同意。
我究竟做错了什么?

Answers:


17

实际上,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上的规范信任库位置,而IMO提供的任何内容都应该基本上像Debian那样进行布局,因为Debian自1999年以来就以与/etc/ssl/certs目录几乎相同的方式进行了布局。RHEL有一个目录,但它位于不是这种格式-它根本不包含任何单独的证书文件。您不能将其用作CApath。老实说,在RHEL(以及Fedora及其衍生产品)上,该目录基本上是一个陷阱。不要使用它。(请参阅https://bugzilla.redhat.com/show_bug.cgi?id=572725https://bugzilla.redhat.com/show_bug.cgi?id=1053882了解为什么它首先存在的背景以及我如何设法解决它)。因此,我认为您对发生的事情是正确的,但对于其原因却是错误的。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/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.crtTLS_CACERT=/etc/pki/tls/cert.pem超过TLS_CACERT=/etc/ssl/certs/ca-bundle.crt

(顺便说一句,在这方面并没有什么新奇的东西,但是在Internet上的混乱非常普遍。RH和衍生产品从未提供过完整的证书目录。它们从2000年开始提供捆绑文件。在2005年从/ usr / share / ssl移至/ etc / pki / tls。自从石器时代以来,Debian /etc/ssl/certs或多或少都具有CApath风格的目录和/etc/ssl/certs/ca-certificates.crt捆绑文件的功能。)


由于细节,此答案值得许多+1。
Christopher Schultz

10

/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


1

还有其他人遇到这个问题;这是在centos 6 openldap和sssd上为我工作的原因:

注意事项:一些“聪明的家伙”决定让sssd要求使用TLS / SSL;行为从centos5更改;这对于外部系统非常有用;但是,如果内部设备上有300多个节点,并且机器集群的内部网络无法访问;这是极其无用的安全功能。

b。而且,自签证书似乎不再起作用。将继续尝试

C。不惜一切代价避免使用NSLCD;当我设置旧式标志并代替sssd(网络组;死锁系统日志等)时,遇到了不间断的问题。

使用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
    

我不会说这是一个无用的功能。您可以避免内部檐篷掉落一处。您可以避免设备在不需要的地方接入流量。有很多原因使它不是没有用的。
2016年

在运行40gig-100gig的内部网络上?认真吗 您将使用什么来利用HPC的后端?仅供参考;那是每秒1 GB的数据。这是强制安全模型的问题...它为所有最终用户做出了通用假设。就像您刚刚做的那样……在运行我专有的100%内部网络的模型上;具有16兆字节的MTU和巨大的管道;100%没用。我们使用其他模型来提高安全性,并且不依赖LDAP / TLS来加密动态数据。
zerobane16年

我不会和互联网上一位炙手可热的作家吵架。但是,如果您仅推动每秒演出并运行100-500台主机,那么我真的看不到此问题。当然,TLS确实需要更多的CPU负载,但是有多种方法可以优化它并重组网络(如果TLS的边际开销对它的影响如此之大,则可能仍需要这样的声音)。也不必强加于您,请使用比例如更低安全性的库sssd
2016年

没有理由贬低言论和攻击;让我们坚持事实。猜测您已提交强制安全模型或支持该模型。仅供参考;在HPC世界中,有1-2%被认为是巨大的。它不是100-500主机;如果您认为hosts = cpu; 您正在与10,000多位主持人交谈。我们可能会结束分支代码,或者转回nslcd。使用“较少”安全模型的问题是网络组支持。优化和重组网络;大声笑; 只有领先的超级计算机公司;确保让我们知道如何做并向我们展示专利。
zerobane

0

这是一个非常普遍的问题,请不用担心,我有一个答案。

首先RHEL克隆具有有两个ldap.conf文件, /etc/ldap.conf或在RHEL 6中已被弃用,但你可以使用/etc/nslcd.conf身份验证目前 /etc/openldap/ldap.conf仅用于查询,因此ldapsearchldapmodifyldapremove,这真的是你的个人资料,这样你就不会得到你想要每次有一个讨厌的长字符串运行ldap命令。

现在,您已经有了两个参数,

  • tls_cacertfile -明确定义ca证书,您应该一切顺利
  • tls_cacertdir-将ca cert放入目录中,但将无法使用,因为它需要进行哈希处理...

使用openssl x509 -hash -noout -in $file , ln -s $file $file.0,则您的CA证书将起作用。

还要注意,如果配置文件在CAPS中,则说明您在/etc/openldap/ldap.conf中工作,它们是完全不同的文件。

希望这能清除一切。


-1

根据我所见过的每个手册页(但我不是CentOS用户),没有这样的事情LDAPTLS_CACERTDIR。要设置的正确变量是TLS_CACERTDIR。您应该/etc/openldap/ldap.conf在CentOS保留LDAP库配置文件的位置或永久位置设置它。另外,您可能需要配置pam-ldap本身以查找CA证书。/etc/pam_ldap.conf我认为在CentOS中,这是,要设置的变量是tls_cacertdir


我首先尝试使用file方法,但是为了简洁起见,选择使用shell变量。如果您阅读手册页Environmental variables may also be used to augment the file based defaults. The name of the variable is the option name with an added prefix of LDAP. For example, to define BASE via the environment, set the variable LDAPBASE to the desired value.
4104年

你当然是对的,我不好。因为我总是使用配置文件,所以我从未读过手册页的那一部分。我正在扫描手册页中是否出现,LDAPTLS_CACERTDIR没有找到任何东西,因此我假设您混淆了变量。抱歉。
daff 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.