Автор: Евгений Афанасьев 
Цепочка проверяется методом CertPathValidator.validate().
Если есть доступ в сеть и включена настройка enableCRLDP, то CRL, если есть ссылки на них в сертификатах, будут скачаны. Иначе их можно скачать/получить отдельно и передать в addCertStore наравне с сертификатами (которые используются при построении цепочки).
Добрый день, Евгений!
Спасибо, за ответ. Хотелось уточнить по поводу списка отзывов, в случае отсутствия интернета.
У меня есть:
1) папка с доверенными сертификатами, включая сертификат минкомсвязи. У организации есть свой УЦ и, возможно, позже их сертификат будет рутовым;
2) Папка со списками отзывов;
3) Файл и откреплённая подпись.
Что делаю (по примерам):
0) Устанавливаю параметры:
Код: System.setProperty("com.ibm.security.enableCRLDP", "false");
System.setProperty("com.sun.security.enableCRLDP", "false");
System.setProperty("com.sun.security.enableAIAcaIssuers", "false");
System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "false");
1) Вытаскиваю из файла подписи сертификат;
2) Проверяю валидность подписи для файла;
3) Подтягиваю сертификаты из папки доверенных;
4) Выбираю рутовый сертификат(минсвязи) и добавляю в TrustAnchor;
5) Создаю CollectionCertStoreParameters и дописываю:
Код: params.setSigProvider("JCP");
params.setRevocationEnabled(true);
6) Добавляю доверенные сертификаты:
Код: Set<X509Certificate> certChain = getCertificatesFromPath(pathToCertificates);
final CertStore store = CertStore.getInstance("Collection", par);
// инициализация объекта построения цепочки сертификатов
final CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
//или для совместимости с КриптоПро УЦ
//CertPathBuilder cpb = CertPathBuilder.getInstance("CPPKIX");
// инициализация параметров построения цепочки сертификатов
final PKIXBuilderParameters params = new PKIXBuilderParameters(
Collections.singleton(anchor), new X509CertSelector());
// добавление к параметрам сертификатов, из которых
// будет строиться цепочка
params.addCertStore(store);
7) Добавляю списки отзывов:
Код: Set<X509CRL> crlListForCheck = getCrlFromPath(pathToCrl);
final CollectionCertStoreParameters parCrl =
new CollectionCertStoreParameters(crlListForCheck); //certs
// создание специального хранилища отзывов сертификатов на основе
// параметров, определенных списком сертификатов
final CertStore storeCrl = CertStore.getInstance("Collection", parCrl);
params.addCertStore(storeCrl);
8) Выбираю конечный сертификат из отсоединённой подписи;
9) Проверяю
Код: final CertPathValidatorResult val_res =
validator.validate(res.getCertPath(), params);
10) Выдаёт "unable to find valid certification path to requested target", если params.setRevocationEnabled(false); <- Всё нормально.
Подскажите, пожалуйста, в какую сторону копать? И соответствуют ли такая проверка формуляру:
ЖТЯИ.00091-02 33 01-01. Руководство программиста.pdf
Отредактировано пользователем 12 ноября 2019 г. 17:27:25(UTC)
| Причина: Не указана