gpt4 book ai didi

ssl - 当有多个具有相同 trustedX500Principals 的证书时,如何从信任库中选择所需的信任证书

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:30 26 4
gpt4 key购买 nike

我有一个 SHA1 即将过期的服务器根证书,并获得了一个 SHA256 生命周期更长的新服务器根证书。我们希望将它们都包含在我们的客户端信任库中,以便我们可以在生产环境切换证书时顺利过渡。

我们通过 javax.net.ssl.TrustManagerFactory 加载信任库,在我们的代码中提供信任管理器,然后我们在运行客户端应用程序时看到错误:

Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:189)
at java.security.Signature$Delegate.engineVerify(Signature.java:1222)
at java.security.Signature.verify(Signature.java:655)
at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:444)
at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:392)
at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:213)

两个受信任的证书具有相同的颁发者,但到期日期和签名算法不同。

我发现根本原因是 sun.security.validator.SimpleValidator 只选择第一个受信任的证书,以防同一颁发者有多个证书

jdk 的 SimpleValidator 源代码说明了原因,如果同一颁发者有多个信任证书,将始终使用第一个:

        // check if we can append a trusted cert
X509Certificate cert = chain[chain.length - 1];
X500Principal subject = cert.getSubjectX500Principal();
X500Principal issuer = cert.getIssuerX500Principal();
List<X509Certificate> list = trustedX500Principals.get(issuer);
if (list != null) {
X509Certificate trustedCert = list.iterator().next();
c.add(trustedCert);
return c.toArray(CHAIN0);
}

我希望有一种方法可以根据同一颁发者的所有可信证书来验证服务器证书。

或者一种根据颁发者和签名算法选择正确信任证书的方法。

我们将不胜感激。

最佳答案

我敢打赌您要连接的服务器只响应叶证书。 super 简单的解决方法是请求服务器以全链(叶 + 中间 + 根 CA)响应,以便 java 可以直接从提供的证书中获取签名名称/算法。

如果这不可能,那么在将服务器证书链传递给验证器时,需要根据颁发者和签名算法名称将所需的信任证书附加到链中。引用:https://github.com/frohoff/jdk8u-jdk/blob/da0da73ab82ed714dc5be94acd2f0d00fbdfe2e9/src/share/classes/sun/security/validator/SimpleValidator.java#L378

关于ssl - 当有多个具有相同 trustedX500Principals 的证书时,如何从信任库中选择所需的信任证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56569747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com