RootCA 证书导入到 cacerts 信任库后,JRE 无法与 AD 建立 LDAPS 连接

Pha*_*ake 4 active-directory java ldap pki certificate-authority

LDAPS 正在通过 ldp.exe 以及 Windows 和 linux 系统上的许多其他程序运行,这些程序似乎不需要根证书。根本。某些使用 JSSE 的程序在将根 CA 和中间 CA 导入 cacerts 信任库后无法连接。

我已经测试过将 NTDS\Personal(来自 AD)中的 LDAPS 证书直接导入 cacerts,并且在某些使用 java 的应用程序中,这会导致安全 LDAP 工作。

在使用 java 并失败的程序中,当导入根证书时,我收到错误:

[Root 异常是 javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径验证失败:java.security.cert.CertPathValidatorException:签名检查失败]

如果我导入 LDAPS 证书,有时会收到错误消息:

[Root 异常是 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
Run Code Online (Sandbox Code Playgroud)

返回正确的证书链,但也返回错误:

verify error:num=20:unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

这显然与 openssl 没有看到根证书有关,所以即使有-cafile附录,我也会得到同样的错误,这可能说明问题,但是根证书的证书链中的指纹与 相同,-cafile所以它看起来应该是正确的...

在这一点上,我开始认为所有“如何使用 Java 启用 LDAPS”中的 70% 是错误的(它们肯定相互矛盾),并且 JAVA CAPS 的规则对我为什么更有意义m 需要导入实际的 LDAPS 证书,而不仅仅是信任根证书。https://docs.oracle.com/cd/E19509-01/820-3399/ggfrj/index.html

编辑:见答案

那么这听起来像是我的证书的配置问题还是其他 Java 特定的问题?

Pha*_*ake 5

事实证明,我在设置 PKI 方面做了所有技术上正确的事情。错误是因为我的证书是用 RSASSA-PSS 签名的。Java 1.8 不支持 PKCS #1 v2.1。

我不得不重新生成从根到颁发 CA 的整个证书链。这需要编辑 CAPolicy.inf

AlternateSignatureAlgorithm=10

还有 cmd 行 certutil -setreg ca\csp\alternatesignaturealgorithm 0

也需要手动指定。

这似乎是一个证书问题,但我从没想过签名兼容性会成为问题。学过的知识。

相关问题: Microsoft 证书颁发机构提供程序兼容性

相关来源:https : //pkisolutions.com/pkcs1v2-1rsassa-pss/