Разбор и проверка сертификата 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).

Ответы на вопрос(1)

Ваш ответ на вопрос