LDAPS 通过 ldp.exe 以及 Windows 和 linux 系统上的许多其他程序运行,这些程序似乎不需要根证书。一点也不。某些使用 JSSE 的程序在将根 CA 和中间 CA 导入 cacerts 信任库后无法连接。
我已经测试将 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
所以看起来应该是正确的...
在这一点上,我开始认为所有“如何使用 Java 启用 LDAPS”中有 70% 是错误的(它们肯定相互矛盾),并且 JAVA CAPS 的规则对于为什么我更有意义m 需要导入实际的 LDAPS 证书,而不仅仅是信任根证书。https://docs.oracle.com/cd/E19509-01/820-3399/ggfrj/index.html
编辑:查看答案
那么这听起来像是我的证书的配置问题,还是听起来像是发生了其他 Java 特定的事情?
事实证明,在设置 PKI 方面,我在技术上所做的一切都是正确的。错误是因为我的证书是用 RSASSA-PSS 签名的。Java 1.8 不支持 PKCS #1 v2.1。
我不得不重新生成从根到颁发 CA 的整个证书链。这需要编辑 CAPolicy.inf
AlternateSignatureAlgorithm=1
至0
还有 cmd 行
certutil -setreg ca\csp\alternatesignaturealgorithm 0
也需要手动指定。
这似乎是一个证书问题,但我从没想过签名兼容性会成为问题。学过的知识。
相关问题: Microsoft 证书颁发机构提供程序兼容性
相关来源: https ://pkisolutions.com/pkcs1v2-1rsassa-pss/