openldap TLS 错误 -8179:无法识别对等方的证书颁发者

openldap TLS 错误 -8179:无法识别对等方的证书颁发者

总结此错误是否意味着我需要找到我公司的 ldap 服务器的公共证书并安装它,或者我公司的 ldap 服务器需要安装我的公共证书?如果是前者,我该如何获取证书并安装它?


我正在尝试将应用程序与我公司的 LDAP 集成。我对 LDAP 和 SSL 非常陌生,因此我提前道歉。我可以在非 SSL 上成功完成此操作,但当我尝试通过 SSL 执行此操作时遇到此问题。我使用的是 Rhel 6.4,openldap版本为 2.4。

使用ldapsearch

ldapsearch -v -h myhost.com -b 'DC=myhost,DC=com, -D 'CN=me,DC=myhost,DC=com' -x -W -Z

或 Python

import ldap
con = ldap.initialize('ldaps://myhost.com')
dn = 'CN=me,DC=myhost,DC=com'
pw = 'password'
con.simple_bind_s(dn, pw)

结果是:

ldap_start_tls: Connect error (-11)
    additional info: TLS error -8179:Peer's Certificate issuer is not recognized.

这是否意味着我需要找到我公司的 ldap 服务器的公共证书并将其安装在某个地方,例如 /etc/openldap/certs?或者,这是否意味着我需要告诉我公司的 ldap 服务器批准我的公共证书?

openssl s_client -connect myhost.com:636

这将转储证书,但最后显示:

Verify return code: 20 (unable to get local issuer certificate)

再次,我不确定这是否意味着我需要 ldap 服务器的证书或反之亦然。

我确实尝试过查看这样的证书链:

openssl s_client -showcerts -connect myhost.com:636

我按顺序复制了证书并创建了一个名为 cert.pem 的文件:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

我尝试过这个:

openssl s_client -connect myhost.com:636 -cert /path/to/cert.pem 

但失败了:

unable to load client certificate private key file
140503604590408:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:
Expecting: ANY PRIVATE KEY

(我也尝试了 -CAfile 和 -CApath,但收到了unable to get local issuer certificate。)

我重新创建了 pem 文件,但这次包含了我服务器的私钥和证书,后面是 ldap 服务器的证书,但Verify return code: 20 (unable to get local issuer certificate)再次收到相同的错误()。

我是否错误地创建了这些证书文件?

答案1

我收到这些错误的原因是因为我没有在我的服务器上安装 ldap 服务器的证书。ldap 服务器不需要安装我的服务器的证书。

我联系了公司内部的某个人,他可以提供两个证书,一个根证书和一个中间证书,两者的der格式都是相同的。值得注意的是,这些证书不一样就像我使用命令收到的一样openssl s_client -showcerts。我跟着此链接将它们从 转换derpem,如下所示:

openssl x509 -in root.cer -inform der -outform pem -out root.pem
openssl x509 -in intermediary.cer -inform der -outform pem -out intermediary.pem
# Combine these files into one cert in exactly this order
cat root.pem > master.pem
cat intermediary.pem >> master.pem

然后我可以正常发出这个命令

openssl s_client -connect myhost:636 -CAfile /path/to/master.pem

使用 Python 进行连接:

import ldap
# point to the cert
cert_file='/path/to/master.pem'
ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, cert_file)
con = ldap.initialize('ldaps://myhost.com')
dn = 'CN=me,DC=myhost,DC=com'
pw = 'password'
con.simple_bind_s(dn, pw)

答案2

Openldap 2.4 使用默认端口 398 进行 tls,因此请尝试通过它使用 s_client。您可以检查 /etc/openldap/slapd.d/ 中的配置文件,检查数据库实例文件 cn=olcDatabase={2}hdb.ldif。此文件可以包含您的证书的文件名和位置。如果您的公司从 goDaddy 等域名提供商处购买证书,您可以购买并使用其证书与 openldap 一起安装,当您上网时,您将不会遇到浏览器的红色警告,因为它是全球证书。或者您可以使用 openssl 创建自己的证书,并将服务器证书部分安装到您的 openldap 服务器,并将客户端部分安装到您的客户端,以使它们能够相互识别。

相关内容