Проверяет ли Java бит cRLSign KeyUsage для сертификатов выдачи CRL?
Я использую реализацию Java для проверки отзыва с использованием CRL, которая похожа на следующий код (я сделал код коротким и понятным)
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker();
rc.setOptions(EnumSet.of(
PKIXRevocationChecker.Option.PREFER_CRLS,
PKIXRevocationChecker.Option.ONLY_END_ENTITY,
PKIXRevocationChecker.Option.NO_FALLBACK,
PKIXRevocationChecker.Option.SOFT_FAIL));
PKIXBuilderParameters pkixParams =
new PKIXBuilderParameters(getTrustStore(), new X509CertSelector());
pkixParams.setRevocationEnabled(false);
pkixParams.addCertPathChecker(rc);
tmf.init(new CertPathTrustManagerParameters(pkixParams));
SSLContext contect = SSLContext.getInstance("TLSv1.2");
context.init(null, getTrustManagers(), null);
defaultFactory = context.getSocketFactory();
Приведенный выше код находится в конструкторе пользовательского SSLSocketFactory, и есть пользовательский TrustManager (возвращаемый getTrustManagers()), который переопределяет checkServerTrusted(), чтобы выполнить несколько проверок сертификата, и в конце выполняет checkServerTrusted() по умолчанию. Все работает отлично, за исключением того, что мне нужно, чтобы проверка CRL была неудачной, когда он подписан центром сертификации, у которого не установлен бит использования ключа cRLsign, но это не так.
Я знаю, что это требование RFC3280, и где-то в Интернете я читал, что реализация Java совместима с RFC, и я даже видел методы в базовом коде Java, чтобы сделать это, но кажется, что это не вступает в игру, когда Я запускаю приложение.
Я сделал всю проверку отзыва с помощью пользовательского кода, чтобы добиться этого, но я думаю, что реализация Java гораздо более полная, чем мой пользовательский код, и я настоятельно предпочитаю использовать реализацию Java.
Любое решение?