У меня скоро истекает срок действия корневого сертификата сервера с SHA1, и я получил новый корневой сертификат сервера с более длительным сроком службы с SHA256. Мы хотим включить их обоих в наше хранилище доверия клиентов, чтобы обеспечить плавный переход, когда среда prod переключает сертификат.
Мы предоставляем диспетчер доверия в нашем коде, загружая хранилище доверенных сертификатов через 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 выбирает только первые доверенные сертификаты в случае, если существует несколько сертификатов с одним и тем же эмитентом
Исходный код SimpleValidator от jdk показывает причину, если для одного и того же эмитента существует несколько доверительных сертификатов, всегда будет использоваться первый:
// 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);
}
Я предполагаю, что существует способ проверки сертификата сервера на основе всех доверенных с одним и тем же эмитентом.
Или способ выбора правильных сертификатов доверия на основе эмитента и алгоритма подписи.
Любая помощь будет оценена.