我有一個 LDAP 伺服器(Active Directory 網域控制器),其憑證由內部中間 CA 簽名,當然也由內部根 CA 簽署。我覺得我在這裡忽略了有關 PKI 的一些基本知識,因為我認為我需要客戶端上的中間 CA 和根 CA 檔案來與 LDAP 伺服器提供的憑證建立信任,所以我不明白為什麼這兩者命令成功。它們是相同的,只是第一個信任根 CA 和中間 CA,而第二個僅信任根憑證。我預計第一個命令會起作用,但第二個命令不會。 (我已經仔細檢查過,即使不使用,輸出也是相同的grep
,並且 .crt 檔案的內容是正確的。)
我有什麼誤解嗎?
export LDAPTLS_CACERT=./chained.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
export LDAPTLS_CACERT=./root_cert_only.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
# and just for fun, let's try it without trusting any CAs. it fails as expected.
export LDAPTLS_CACERT=''; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)"
ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized.
注意:我慘痛地了解到,ldapsearch
macOS 上不支援透過環境變數中設定的路徑來信任憑證。上面的輸出來自linux(ldapsearch
版本2.4.40)
答案1
第一個命令(同時使用根CA 和從屬CA)之所以有效,是因為您的客戶端明確信任根證書- 它位於信任錨存儲中- 並且此根已簽署從屬CA 證書,因此您的客戶端也隱式信任該憑證。
第二個指令有效是因為 TLS 規範狀態那個伺服器必須傳送驗證伺服器憑證所需的所有憑證。因此,您的 LDAP 伺服器會傳送其證書,然後傳送從屬 CA 憑證。
實際上,這兩個命令是相同的。在第一個範例中,用戶端從命令列和伺服器接收從屬 CA 憑證。
請注意,伺服器不需要傳送根證書,因為該證書必須已安裝在您的用戶端上並且受信任。