LDAPS 透過 ldp.exe 以及 Windows 和 Linux 系統上的許多其他程式運行,這些程式似乎不需要根憑證。根本不。將根 CA 和中間 CA 匯入 cacerts 信任庫後,某些使用 JSSE 的程式無法連線。
我已經測試過將 NTDS\Personal(從 AD)中存在的 LDAPS 憑證直接匯入到 cacerts 中,並且在某些使用 java 的應用程式中,這會導致安全 LDAP 正常運作。
在使用 java 並失敗的程式中,當匯入根憑證時,我收到錯誤:
[根異常是 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX 路徑驗證失敗: java.security.cert.CertPathValidatorException: 簽章檢查失敗]
如果我匯入 LDAPS 證書,有時會收到錯誤:
[根異常是 javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: 憑證不符合演算法約束]
(即使註解掉 java.security 之後)
或者它根據使用 JRE 的程式開始工作;然而,常見的障礙是 JRE 似乎普遍不喜歡基於錯誤的憑證鏈。
MY CDP/AIA 可透過 HTTP 在內部使用,所有憑證均由受信任的私有內部 2 層 Windows PKI 簽署。
openssl s_client -connect -showcerts domain:port
傳回正確的憑證鏈,但也回傳錯誤:
verify error:num=20:unable to get local issuer certificate
這顯然與 openssl 沒有看到根憑證有關,所以即使有-cafile
附錄,我也會得到相同的錯誤,這可能很能說明問題,但根憑證的憑證鏈中的指紋與根憑證相同,所以-cafile
看起來應該是正確的...
在這一點上,我開始認為所有「如何使用 Java 啟用 LDAPS」中的 70% 都是錯誤的(它們肯定都相互矛盾),並且 JAVA CAPS 的規則對於我的原因更有意義我需要導入實際的LDAPS證書,而不僅僅是信任根證書。https://docs.oracle.com/cd/E19509-01/820-3399/ggfrj/index.html
編輯:請參閱答案
那麼這聽起來像是我的憑證的設定問題還是聽起來像是發生了其他 Java 特定的問題?
答案1
事實證明,我在設定 PKI 方面所做的一切在技術上都是正確的。這些錯誤是因為我的憑證是使用 RSASSA-PSS 簽署的。 Java 1.8 不支援 PKCS #1 v2.1。
我必須重新產生從根到頒發 CA 的整個憑證鏈。這需要編輯 CAPolicy.inf
AlternateSignatureAlgorithm=1
到0
還有命令列
certutil -setreg ca\csp\alternatesignaturealgorithm 0
也需要手動指定。
這似乎是一個憑證問題,但我從未想過簽名相容性會成為一個問題。學過的知識。
相關問題: Microsoft 憑證授權單位提供者相容性