总结此错误是否意味着我需要找到我公司的 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
。我跟着此链接将它们从 转换der
为pem
,如下所示:
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 服务器,并将客户端部分安装到您的客户端,以使它们能够相互识别。