Ssl

openldap TLS 錯誤 -8179:Peer 的證書頒發者無法辨識

  • February 10, 2016

tl;dr這個錯誤是否意味著我需要找到我公司的 ldap 伺服器的公共證書並安裝它,或者我公司的 ldap 伺服器需要安裝我的公共證書?如果是前者,我該如何獲取證書並安裝它?


我正在嘗試將應用程序與我公司的 LDAP 集成。我對 LDAP 和 SSL 很陌生,所以我提前道歉。我可以在非 SSL 上成功執行此操作,但是當我嘗試通過 SSL 執行此操作時遇到了這個問題。我在openldap2.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我按照此連結將它們從 轉換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)

引用自:https://serverfault.com/questions/754903