Разбор и проверка сертификата Java X509
Я пытаюсь обработать сертификаты X509 в несколько этапов и сталкиваюсь с несколькими проблемами. Я новичок в JCE, поэтому я еще не совсем в курсе всех событий.
Мы хотим иметь возможность анализировать несколько разных сертификатов X509 на основе разных кодировок (PEM, DER и PCKS7). Я экспортировал тот же сертификат изhttps://belgium.be в формате PEM и PCKS7 с использованием FireFox (сертификат, включая цепочку). Я оставил пару строк, которые не нужны для вопросов.
<code>public List<X509Certificate> parse(FileInputStream fis) { /* * Generate a X509 Certificate initialized with the data read from the inputstream. * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates. */ List<X509Certificate> certificates = null; log.debug("Parsing new certificate."); certificates = (List<X509Certificate>) cf.generateCertificates(fis); return certificates; } </code>
Этот код работает нормально, пока я работаю с FileInputStream вместо BufferedInputStream для PCKS7, что уже довольно странно, я думаю? Но я могу жить с этим.
Следующим шагом является проверка этих цепочек сертификатов. 1) Проверьте, все ли сертификаты имеют действительную дату (легко) 2) Проверка цепочки сертификатов с использованием OCSP (и возврат к CRL, если в сертификате не найден URL OCSP). Здесь я не совсем уверен, как с этим справиться.
Я использую Sun JCE, но кажется, что для этого не так много документации (в примерах)?
Сначала я сделал простую реализацию, которая проверяет только цепочку без прохождения проверок OCSP / CRL.
<code>private Boolean validateChain(List<X509Certificate> certificates) { PKIXParameters params; CertPath certPath; CertPathValidator certPathValidator; Boolean valid = Boolean.FALSE; params = new PKIXParameters(keyStore); params.setRevocationEnabled(false); certPath = cf.generateCertPath(certificates); certPathValidator = CertPathValidator.getInstance("PKIX"); PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) certPathValidator.validate(certPath, params); if(null != result) { valid = Boolean.TRUE; } return valid; } </code>
Это нормально работает для моего сертификата PEM, но не для сертификата PCKS7 (тот же сертификат, только экспортированный в другом формате). java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors.
Единственное отличие, которое я могу видеть, состоит в том, что порядок формирования CertPath не совпадает? Я не смог выяснить, что происходит не так, поэтому я оставил это сейчас и продолжил работу с сертификатом PEM, но давайте назовем это ВОПРОС 1;)
Затем я хотел реализовать проверку OCSP. Очевидно, если я включу OCSP, используя:Security.setProperty("ocsp.enable", "true"); и установитьparams.setRevocationEnabled(true); он должен быть в состоянии найти URL OCSP сам по себе, но, похоже, это не так. Что должна делать стандартная реализация (ВОПРОС 2)? java.security.cert.CertPathValidatorException: Must specify the location of an OCSP Responder
Пройдя мимо этого, я нашел способ извлечь URL-адрес OCSP из сертификата, используя AuthorityInfoAccessExtension и тому подобное.
Но после установки URL OCSP вручную в свойстве ocsp.url, я получаюjava.security.cert.CertPathValidatorException: OCSP response error: UNAUTHORIZED
Кажется, что я пропустил много необходимых шагов, в то время как во многих онлайн-ссылках говорится, что установкаocsp.enable имущество должно быть все, что вам нужно сделать?
Может быть, кто-нибудь из вас, одаренных, не может немного помочь мне? Покажите мне, где я совершенно не прав :)
Следующим шагом будет реализация проверок CRL, если OCSP не будет найден, если кто-нибудь сможет указать какой-либо пример или показать мне некоторую документацию по этому вопросу, это также будет высоко оценено!
Спасибо!
EDIT: Поскольку он не выбирает свойства сам по себе, я пытался установить все свойства самостоятельно, используя следующее:
<code> // Activate OCSP Security.setProperty("ocsp.enable", "true"); // Activate CRLDP -- no idea what this is Security.setProperty("com.sun.security.enableCRLDP", "true"); X509Certificate target = (X509Certificate) certPath.getCertificates().get(0); Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/"); Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName()); Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName()); Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16)); </code>
Что дает исключение: java.security.cert.CertPathValidatorException: не удается найти сертификат респондента (устанавливается с использованием свойств безопасности OCSP).