Вопрос по jce, x509certificate, java, validation, pki – Разбор и проверка сертификата Java X509

12

Я пытаюсь обработать сертификаты 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).

OSCPChecker, кажется, делает это в методе getOCSPServerURI:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… Will Sargent
Это было давно, но я бы сказал,docs.oracle.com/javase/7/docs/api/java/security/cert/… Driss Amri
что такоеcf в твоем примере? spy

Ваш Ответ

1   ответ
15

Для дальнейшего использования я выложу ответ на свой вопрос (частично, по крайней мере)

Проверки OCSP и CRL уже реализованы в стандартной реализации Java, и нет необходимости в пользовательском коде или других поставщиках (BC, ..). Они отключены по умолчанию.

Чтобы включить это, вы должны по крайней мере установить два параметра:

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true);
Security.setProperty("ocsp.enable", "true");

Это активирует проверку OCSP, когда вы пытаетесь проверить путь сертификата (PKIXCertPathValidatorResult.validate ()).

Если вы хотите добавить запасную проверку для CRL, если OCSP недоступен, добавьте дополнительное свойство:

System.setProperty("com.sun.security.enableCRLDP", "true");

Многие мои проблемы происходят из-за того, что я должен поддерживать разные форматы сертификатов (PKCS7, PEM). Моя реализация прекрасно работает для PEM, но поскольку PKCS7 НЕ сохраняет порядок сертификатов в цепочке, это немного сложнее (http://bugs.sun.com/view_bug.do?bug_id=6238093)

X509CertSelector targetConstraints = new X509CertSelector();

targetConstraints.setCertificate(certificates.get(0));
// Here's the issue for PKCS7 certificates since they are not ordered,
// but I havent figured out how I can see what the target certificate
// (lowest level) is in the incoming certificates..

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints);   

Надеюсь, что это будет полезным замечанием и для других людей, возможно, кто-то может пролить свет на то, как найти целевой сертификат в неупорядоченном списке PKCS7?

Похожие вопросы