Я использую библиотеку jumpyCastle с включенным режимом FIPS для связи SSL. Итак, у меня есть только 3 провайдера в файле java.security следующим образом:
security.provider.1=org.bouncycastle.jcajce.provider.BuncyCastleFipsProvider Security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider fips:BCFIPS Security.provider.3=СОЛНЦЕ Я написал простую программу для проверки соединения с одним из наших сайтов:
// включаем проверку отзыва System.setProperty("com.sun.net.ssl.checkRevocation", "true"); // включаем CDP System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("org.bouncycastle.x509.enableCRLDP", "true"); // отключаем OCSP Security.setProperty("ocsp.enable", "false"); URL url = новый URL(""); Соединение HttpsURLConnection = (HttpsURLConnection) url.openConnection(); соединение.подключиться(); Однако соединение не удается из-за следующей ошибки:
org.bouncycastle.tls.TlsFatalAlert: certificate_unknown(46) в org.bouncycastle.jsse.provider.ProvSSLSocketDirect.checkServerTrusted(ProvSSLSocketDirect.java:134) в org.bouncycastle.jsse.provider.ProvTlsClient$1.notifyServerCertificate(ProvTlsClient.java:335) в org.bouncycastle.tls.TlsUtils.processServerCertificate(TlsUtils.java:4544) в org.bouncycastle.tls.TlsClientProtocol.handleServerCertificate(TlsClientProtocol.java:842) в org.bouncycastle.tls.TlsClientProtocol.handleHandshakeMessage(TlsClientProtocol.java:728) в org.bouncycastle.tls.TlsProtocol.processHandshakeQueue(TlsProtocol.java:652) в org.bouncycastle.tls.TlsProtocol.processRecord(TlsProtocol.java:548) в org.bouncycastle.tls.RecordStream.readRecord(RecordStream.java:232) в org.bouncycastle.tls.TlsProtocol.safeReadRecord(TlsProtocol.java:800) в org.bouncycastle.tls.TlsProtocol.blockForHandshake(TlsProtocol.java:396) в org.bouncycastle.tls.TlsClientProtocol.connect(TlsClientProtocol.java:91) в org.bouncycastle.jsse.provider.ProvSSLSocketDirect.startHandshake(ProvSSLSocketDirect.java:430) в org.bouncycastle.jsse.provider.ProvSSLSocketDirect.startHandshake(ProvSSLSocketDirect.java:411) по адресу java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567) по адресу java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:171) по адресу java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:142) в com.test.TestConnection.main(TestConnection.java:153) Вызвано: java.security.cert.CertificateException: невозможно создать действительную цепочку. в org.bouncycastle.jsse.provider.ProvX509TrustManager.validateChain(ProvX509TrustManager.java:308) в org.bouncycastle.jsse.provider.ProvX509TrustManager.checkTrusted(ProvX509TrustManager.java:267) в org.bouncycastle.jsse.provider.ProvX509TrustManager.checkServerTrusted(ProvX509TrustManager.java:174) в org.bouncycastle.jsse.provider.ProvSSLSocketDirect.checkServerTrusted(ProvSSLSocketDirect.java:130) ... еще 16 Вызвано: java.security.cert.CertPathBuilderException: не удалось проверить путь сертификации. в org.bouncycastle.jcajce.provider.PKIXCertPathBuilderSpi.engineBuild (неизвестный источник) в java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) в org.bouncycastle.jsse.provider.ProvX509TrustManager.buildCertPath(ProvX509TrustManager.java:240) в org.bouncycastle.jsse.provider.ProvX509TrustManager.validateChain(ProvX509TrustManager.java:295) ... еще 19 Вызвано: java.security.cert.CertPathValidatorException: не найдены списки отзыва сертификатов для эмитента "CN=Корневой центр сертификации Starfield Services - G2, O="Starfield Technologies, Inc.", L=Scottsdale, ST=Arizona, C=US" в org.bouncycastle.jcajce.provider.RFC3280CertPathUtilities.processCertA (неизвестный источник) в org.bouncycastle.jcajce.provider.PKIXCertPathValidatorSpi.engineValidate (неизвестный источник) в org.bouncycastle.jcajce.provider.PKIXCertPathBuilderSpi.build (неизвестный источник) в org.bouncycastle.jcajce.provider.PKIXCertPathBuilderSpi.build (неизвестный источник) в org.bouncycastle.jcajce.provider.PKIXCertPathBuilderSpi.build (неизвестный источник) ... еще 23 Вызвано: org.bouncycastle.jcajce.provider.AnnotatedException: не найдены списки отзыва сертификатов для эмитента "CN=Корневой центр сертификации Starfield Services - G2, O="Starfield Technologies, Inc.", L=Scottsdale, ST=Arizona, C=US " в org.bouncycastle.jcajce.provider.CertPathValidatorUtilities.getCompleteCRLs (неизвестный источник) в org.bouncycastle.jcajce.provider.RFC3280CertPathUtilities.checkCRL (неизвестный источник) в org.bouncycastle.jcajce.provider.RFC3280CertPathUtilities.checkCRLs (неизвестный источник) ... еще 28 Я проверил, что действительный CRLDP настроен в каждом сертификате в цепочке сертификатов. Вот как выглядит цепочка сертификатов (сертификат CA, выделенный синим, присутствует в моем хранилище доверенных сертификатов JDK):

Тот же код работает нормально (соединение успешно) БЕЗ jumpyCastle (с использованием поставщиков JDK по умолчанию). Однако, чтобы он работал с jumpyCastle, мне нужно поместить всю цепочку сертификатов в мое хранилище доверенных сертификатов (включая сертификат конечного объекта), что совершенно непрактично.
Может ли кто-нибудь помочь мне разобраться в этой проблеме?