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

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

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

我已经测试将 NTDS\Personal 中的 LDAPS 证书(来自 AD)直接导入 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看起来应该是正确的......

此时,我开始认为 70% 的“如何使用 Java 启用 LDAPS”都是错误的(它们肯定互相矛盾),并且 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=10

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

也需要手动指定。

这看起来像是一个证书问题,但我从未想到签名兼容性会是个问题。吸取了教训。

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

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

相关内容