我有一台 LDAP 服务器(Active Directory 域控制器),该服务器的证书由内部中介 CA 签名,当然也由内部根 CA 签名。我觉得我在这里忽略了有关 PKI 的一些基本知识,因为我认为我需要客户端的中介 CA 和根 CA 文件来与 LDAP 服务器提供的证书建立信任,所以我不明白为什么这两个命令都成功了。它们是相同的,只是第一个命令信任根 CA 和中介 CA,而第二个命令仅信任根证书。我预计第一个命令可以工作,但第二个命令不行。(我仔细检查了输出是否相同(即使不使用时)grep
以及 .crt 文件的内容是否正确。)
我误解了什么?
export LDAPTLS_CACERT=./chained.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
export LDAPTLS_CACERT=./root_cert_only.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
# and just for fun, let's try it without trusting any CAs. it fails as expected.
export LDAPTLS_CACERT=''; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)"
ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized.
注意:我经历了痛苦的教训,ldapsearch
macOS 不支持通过环境变量中设置的路径来信任证书。上面的输出来自 linux(ldapsearch
版本 2.4.40)
答案1
第一个命令(使用根 CA 和从属 CA)有效,因为您的客户端明确信任根证书 - 它位于信任锚存储中 - 并且该根已签署从属 CA 证书,因此您的客户端也隐式信任该证书。
第二条命令有效,因为 TLS 规范状态该服务器必须发送验证服务器证书所需的所有证书。因此,您的 LDAP 服务器会发送其证书,然后发送下属 CA 证书。
实际上,这两个命令是相同的。在第一个示例中,客户端从命令行和服务器接收从属 CA 证书。
请注意,服务器不需要发送根证书,因为该证书必须已经安装在您的客户端上并且受信任。