Проверка подписи с помощью CertPathValidator, включая отзыв CRL

В контексте проверки подписи я хочу проверить действительность сертификата подписи в то время, когда документ был подписан. Я понял, что метод проверки отзыва отзыва CRL не используется, если я указываю прошедшую дату, в то время как при использовании текущего времени или нуля проверки отзыва работают нормально. Я использую следующий код

 CertificateFactory cf = CertificateFactory.getInstance( "X.509" );
 CertPath certPath =    cf.generateCertPath( certs );
 CertPathValidator cpv = CertPathValidator.getInstance( "PKIX", "SUN" );
PKIXParameters params = new PKIXParameters( ks );
params.setDate( signingTime );
params.setRevocationEnabled( true );                
cpvResult = (PKIXCertPathValidatorResult) cpv.validate( certPath, params ); 

Я уже включил системное свойство EnabledCRLDP. Кроме того, OCSP не является универсальным решением, так как не работает, это некоторые сертификаты.

Есть какая-то причина, чтобы не использовать метод отзыва CRL в прошедшей проверке времени?

Есть какой-то способ заставить CRL использовать в этом случае?

1 ответ

Решение

Центр сертификации имеет только текущий статус сертификатов. Невозможно запросить статус за прошедшую дату: центр сертификации мог удалить списки отзыва сертификатов, выпущенные на эту дату, или даже все записи могли быть очищены, если срок действия сертификата истек

Поэтому проверку прошедшего времени можно выполнить только с использованием CRL или OCSP, выпущенных на эту дату. Необходимо сохранить доказательства отзыва вместе с подписью, которая будет использоваться в будущем.(Существует специальный формат цифровой подписи, предназначенный для хранения доказательств отзыва, например, AdES).

Я подозреваю, что основная реализация CertPathValidator отключает запрос CRL, если указана прошедшая дата. Обратите внимание, что PKIX не определяет способ проверки отзыва. Смотрите официальное руководство по безопасности Java

setRevocationEnabled Метод позволяет вызывающей стороне отключить проверку отзыва. Проверка отзыва включена по умолчанию, поскольку это обязательная проверка алгоритма проверки PKIX. Однако PKIX не определяет, как следует проверять отзыв. Реализация может использовать CRL или OCSP, например.

Используя Java 8, вы можете установить желаемый набор ответов CRL и / или OCSP, используя

 params.setCertStores(certStoreList);. //store containing crls
 PKIXRevocationChecker rc =  (PKIXRevocationChecker)cpv.getRevocationChecker();
 rc.setOcspResponses(responses)

Но, как вы сказали, этот метод недоступен для Java 6, поэтому я думаю, что вы можете отключить проверку отзыва и выполнить проверку OCSP и CRL вручную после проверки цепочки сертификации.

Например, используйте это для проверки сертификата с помощью CRL

CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509CRL crl = (X509CRL)cf.generateCRL(inStream); 
crl.isRevoked(certificate);

Ответы OCSP могут быть обработаны с использованием bouncycastle. См. Этот вопрос. Ответ OCSP не дает статуса сертификата (пропустите часть, в которой запрашивается ocsp, поскольку у вас должен храниться локальный ответ)

Другие вопросы по тегам