openldap TLS错误-8179:对方的证书颁发者不被识别

tl; dr这个错误是否意味着我需要find我公司的ldap服务器的公共证书并安装它,或者我公司的ldap服务器需要安装我的公共证书? 如果前者,我如何获得证书并安装它?


我试图将应用程序与我公司的LDAP集成在一起。 我对LDAP和SSL很陌生,所以我提前道歉。 我可以在非ssl上成功完成这项工作,但是当我试图通过SSL来做这件事时,我遇到了这个问题。 我正在使用openldap 2.4版本的Rhel 6.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. 

这是否意味着我需要find我公司的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 

我按顺序复制了证书,并创build了一个名为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 。)

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

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

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

我联系了我公司内能够提供两种证书,一种根证书和一种中间证书(两种格式)的人员。 值得注意的是,这些证书与我使用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) 

OpenLDAP 2.4使用tls的默认端口398,所以通过它尝试s_client。 你可以在/etc/openldap/slapd.d/中检查configuration文件,检查数据库实例文件cn = olcDatabase = {2} hdb.ldif。 该文件可以包含您的证书的文件名和位置。 如果您的公司购买像goDaddy这样的域名提供商的证书,您可以购买和使用其证书来安装openldap,而当您在互联网上冲浪时,您将不会遇到来自浏览器的红色警告,因为它是全球证书。 或者你可以使用openssl创build自己的证书,并将服务器证书部分安装到你的openldap服务器上,并将客户端部分安装到你的客户端,以使它们能够相互识别。