Centos

CentOS openLDAP 證書信任問題

  • September 30, 2015
# LDAPTLS_CACERTDIR=/etc/ssl/certs/ ldapwhoami -x -ZZ -H ldaps://ldap.domain.tld
ldap_start_tls: Can't contact LDAP server (-1)
     additional info: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.

# openssl s_client -connect ldap.domain.tld:636 -CApath /etc/ssl/certs
<... successful tls negotiation stuff ...>
   Compression: 1 (zlib compression)
   Start Time: 1349994779
   Timeout   : 300 (sec)
   Verify return code: 0 (ok)
---

openssl似乎認為證書很好,但openldap圖書館(pam_ldap表現出類似的行為,這就是我如何處理這個爛攤子)不同意。

我究竟做錯了什麼?

RHEL 實際上並沒有提供任何可用作 CA 信任目的的“證書目錄”的東西。對於 OpenSSL,證書目錄 - “CApath” - 是包含單個證書文件的目錄(採用 PEM 格式或 OpenSSL 的擴展“受信任證書”格式),其名稱採用基於證書主題名稱雜湊的特定格式。通常這是通過將具有人類可讀名稱和.pem副檔名的文件放在目錄中並c_rehash在其上執行來實現的(參見man c_rehash)。對於自 3.3.6 以來的 GnuTLS(在此之前 GnuTLS 沒有目錄支持),它只是一個包含 PEM 文件的目錄;GnuTLS 將嘗試載入目錄中的每個文件並在任何 PEM-ish 上成功(它無法處理 OpenSSL 的“受信任證書”格式)。老實說,我不確定 NSS 是否真的可以以某種方式使用一個充滿單個證書文件的目錄作為信任根,但 OpenLDAP 的文件似乎表明它可以(但如果該目錄還包含一個 NSS 數據庫,它將給予該優先級)。無論如何,RHEL 沒有像一個充滿單個 CA 證書文件的目錄這樣的東西。

Debian 及其衍生產品/etc/ssl/certs以這種格式提供;/etc/ssl/certs是 Debian 上的規範信任儲存位置,IMO 提供它的任何東西基本上都應該像 Debian 一樣佈置,因為 Debian 的目錄從 1999 年開始就以或多或少相同的方式佈置。RHEL 有一個/etc/ssl/certs目錄,但它在不是這種格式 - 它根本不包含任何單獨的證書文件。您不能將其用作 CApath。老實說,在 RHEL(以及 Fedora 和衍生產品)上,該目錄基本上是一個陷阱。不要使用它。(參見https://bugzilla.redhat.com/show_bug.cgi?id=572725>和<https://bugzilla.redhat.com/show_bug.cgi?id=1053882有關它最初存在的原因以及我如何嘗試修復它的一些背景)。所以我認為你對正在發生的事情是正確的,但對於原因是錯誤的。OpenLDAP 沒有做錯任何事情,也沒有失敗,因為“ca-bundle.trust.crt…是一個 Mozilla NSS 證書/密鑰數據庫”(它們被稱為cert8/9.dband key3/4.db,而 RHEL 上的系統範圍的數據庫位於/etc/pki/nssdb) ,它只是失敗了,因為/etc/ssl/certs根本不能用作“證書目錄”。

RHEL 也沒有在其他任何地方提供任何可用作 CApath 樣式信任儲存的東西。RHEL 的系統信任庫作為單個 PEM 捆綁文件(OpenSSL 術語中的“CAfile”)提供,可在/etc/pki/tls/certs/ca-bundle.crt/etc/pki/tls/cert.pem. 它也可以在/etc/ssl/certs/ca-bundle.crtas/etc/ssl/certs實際上只是一個符號連結到/etc/pki/tls/certs,但該位置不是規範的,並且真的不應該被任何東西使用。RHEL 還提供了 OpenSSL 的“受信任證書”格式的捆綁包,即/etc/pki/tls/certs/ca-bundle.trust.crt.

如您所見,正確的做法是使用系統提供的捆綁文件。你的回答會奏效,但由於上述原因,我強烈建議TLS_CACERT=/etc/pki/tls/certs/ca-bundle.crtTLS_CACERT=/etc/pki/tls/cert.pem超過TLS_CACERT=/etc/ssl/certs/ca-bundle.crt.

(順便說一句,這並沒有什麼新東西,但是網際網路上的混亂很普遍。RH 和衍生產品從來沒有提供過一個完整的證書目錄。他們從 2000 年開始就提供了一個捆綁文件。它是2005 年從 /usr/share/ssl 移動到 /etc/pki/tls。自石器時代以來,Debian 或多或少地兼有/etc/ssl/certsCApath 風格的目錄和/etc/ssl/certs/ca-certificates.crt捆綁文件。)

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