841*_*104 13 openldap centos openssl tls
# 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)
---
Run Code Online (Sandbox Code Playgroud)
openssl
似乎认为证书没问题,但是openldap
的库(pam_ldap
表现出类似的行为,这就是我陷入困境的方式)不同意。
我究竟做错了什么?
Ada*_*son 20
事实上,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
and 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
as找到,/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
over 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
也有或多或少的捆绑文件。)
841*_*104 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
.
归档时间: |
|
查看次数: |
48447 次 |
最近记录: |