Проверка листового сертификата от третьего лица в Java 8 - PullRequest
3 голосов
/ 19 сентября 2019

Я ищу способ проверки объекта java.security.cert.X509Certificate, отправленного третьей стороной.Поставщик сертификата использует dns или ldap для получения сертификата.Я включил ссылку с дополнительной информацией о том, как извлекается сертификат.

http://wiki.directproject.org/w/images/2/24/Certificate_Discovery_for_Direct_Project_Implementation_Guide_v4.1.pdf

Мне также нужно знать протоколы и порты по умолчанию, которые будут использоваться на любом из этапов проверки,Сертификат должен соответствовать следующим критериям на странице 13 раздела 4 этого документа:

http://wiki.directproject.org/w/images/e/e6/Applicability_Statement_for_Secure_Health_Transport_v1.2.pdf

  1. Не истек.
  2. Имеет действительную подпись сдействительный дайджест сообщения
  3. Не отозван
  4. Привязка к ожидаемому объекту
  5. Имеет путь доверенного сертификата

Элемент 1 является прямымчтобы сравнить даты из методов getNotAfter и getNotBefore на объекте сертификата с текущей датой или использовать метод checkValidity, который выдает проверенное исключение.

Для элемента № 2 я вижу метод для получения подписи,но я не уверен, как создать дайджест сообщения и убедиться, что подпись и дайджест сообщения действительны.

Для элемента № 3 список отзыва сертификатов, кажется, смешивается с некоторыми другими данными, вызывая этот метод всертификат getExtensionValue ("2.5.29.31").Получение данных из списка отзыва сертификатов представляется возможным по протоколу http, а протокол ocsp основан на http.Я не смог найти, как это сделать в Java.

Для пункта № 4 я не уверен, что означает привязка в контексте сертификатов, или что связано с ее проверкой.

Для элемента № 5 похоже, что данные для промежуточных сертификатов смешиваются с некоторыми другими данными, вызывая этот метод в сертификате getExtensionValue («1.3.6.1.5.5.7.1.1»).CertPathValidator выглядит так, как будто он может помочь проверить эту информацию после получения данных сертификатов по http.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Проверка сертификата - сложная задача.Вы можете выполнить все необходимые проверки вручную (срок действия, отзыв, цепочка сертификации), используя родную поддержку Java 8 или Bouncycastle.Но я бы порекомендовал использовать специальную библиотеку, в которой уже учтены все возможности.

Посмотрите документацию DSS и Пример подтверждения сертификата

    // Trusted certificates sources, root and intermediates (#5 )
    CertificateSource trustedCertSource = null;
    CertificateSource adjunctCertSource = null;


    // The certificate to be validated
    CertificateToken token = DSSUtils.loadCertificate(new File("src/main/resources/keystore/ec.europa.eu.1.cer"));

    // Creates a CertificateVerifier using Online sources. It checks the revocation status with the CRL lists URLs or OCSP server extracted from the certificate #3
    CertificateVerifier cv = new CommonCertificateVerifier();
    cv.setAdjunctCertSource(adjunctCertSource);     
    cv.setTrustedCertSource(trustedCertSource);

    // Creates an instance of the CertificateValidator with the certificate
    CertificateValidator validator = CertificateValidator.fromCertificate(token);
    validator.setCertificateVerifier(cv);

    // We execute the validation (#1, #2, #3, #5)
    CertificateReports certificateReports = validator.validate();

    //The final result. You have also a detailedReport and DiagnosticData
    SimpleCertificateReport simpleReport = certificateReports.getSimpleReport();

В ходе проверки будут выполнены все указанные вами действия, включая истечение срока действия, подписание сертификата, отзыв и проверку цепочки доверия (включая загрузку промежуточных сертификатов).

Шаг № 4 Я не знаю точно, что вы имеете в виду.Я предполагаю проверить, что сертификат соответствует одному из объектов сертификации из списка доверенных

Чтобы загрузить источники доверенных сертификатов, см. this

CertificatePool certPool = new CertificatePool();
CommonCertificateSource ccc = new CommonCertificateSource(certPool);
CertificateToken cert = DSSUtils.loadCertificate(new File("root_ca.cer"));
CertificateToken adddedCert = ccc.addCertificate(cert);
1 голос
/ 21 сентября 2019

Я разделю ответ на 3 части.Первый - это фон, второй - выбор библиотеки, кода реализации (ссылки, которые я использовал для своей реализации с должным доверием)

В прошлом я реализовывал очень похожий вариант использования.У меня были изготовления IOT от поставщика, и для их внедрения я реализовал тот же процесс проверки X509, который вы упомянули.

Реализация: Для моей реализации я ссылался на следующее.Вы можете включить BC в качестве вашего defaultProvider (Security.setProvider) и использовать следующий код.Код напрямую решает 1,3,5.Код здесь: https://nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

Теперь перейдем к 2, ответ на этот вопрос зависит от того, как вы получите сертификат от вашего клиента и какие дополнительные данные будут предоставлены приложением.Этот высокоуровневый поток выглядит следующим образом: а) клиент создает сертификат; б) клиент выполняет дайджест с использованием некоторого приемлемого алгоритма.SHA256 довольно популярны, вы можете увеличить силу в зависимости от потребностей и количества вычислений, которые у вас есть.Как только клиент создает дайджест, чтобы доказать, что он является владельцем сертификата, вы можете подписать дайджест, используя закрытый ключ устройства.Затем это может быть передано приложению верификатора. C) Получив сертификат и подпись, вы можете использовать сертификат и открытый ключ, связанный с ним, для проверки подписи, применяя тот же дайджест, а затем проверки подписи.здесь: http://www.java2s.com/Code/Java/Security/SignatureSignAndVerify.htm

Я не уверен на 100%, что означает 4.Но если это означает подтверждение личности (тот, кто создает сертификат, обязательно должен быть тем, кем он является, подпись и проверка обеспечат то же самое)

Хотя вы можете реализовать варианты использования с помощью API-интерфейсов безопасности Java, я использовал bouncycastleосновной API для реализации вариантов использования.API Bouncycastle гораздо более богаты и проверены в бою, особенно для странных алгоритмов кривой EC, которые мы должны были использовать, и вы обнаружите, что многие люди клянутся BouncyCastle.

Надеюсь, это поможет!

...