openldap TLS 錯誤 -8179:Peer 的證書頒發者無法辨識
tl;dr這個錯誤是否意味著我需要找到我公司的 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.
這是否意味著我需要找到我公司的 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)
再次收到相同的錯誤 ( )。我是否錯誤地創建了這些證書文件?
我收到這些錯誤的原因是我的伺服器上沒有安裝 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)