Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline xlink  
#1 Оставлено : 18 ноября 2010 г. 14:44:22(UTC)
xlink

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2010(UTC)
Сообщений: 14
Откуда: Москва

Добрый день!

Имею следующий код:

cpp = new PKIXBuilderParameters(trustSet, null);
cpp.setSigProvider(null);

List tempCerts = new LinkedList();
tempCerts.addAll(trustList);
tempCerts.add(certificate);
tempCerts.add(crl); //???

CollectionCertStoreParameters par = new CollectionCertStoreParameters(tempCerts);
CertStore store = CertStore.getInstance("Collection", par);
cpp.addCertStore(store);
X509CertSelector selector = new X509CertSelector();
selector.setCertificate((X509Certificate) certificate);
cpp.setTargetCertConstraints(selector);

cpp.setRevocationEnabled(false);
PKIXCertPathBuilderResult res = (PKIXCertPathBuilderResult) CertPathBuilder.getInstance("PKIX").build(cpp);
CertPath cp = res.getCertPath();
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
cpp.setRevocationEnabled(true);
cpv.validate(cp, cpp);

Вопрос: нужно ли вносить crl (предварительно получив его) в список tempCerts для проверки валидности? crl получен так:

CertificateFactory cf = CertificateFactory.getInstance("X509");
crl = cf.generateCRL(new URL(crlUrl).openStream());

Вопрос возник потому, что в примерах КриптоПро (OCSPValidateCert) crl в список не заносится

Заранее спасибо
Offline Iva  
#2 Оставлено : 18 ноября 2010 г. 16:59:11(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Вопрос проверки корректности сертификата можно решать либо через CRL либо через OCSP. Выбирать Вам. У каждого способа есть преимущества и недостатки. Тут написано подробнее http://www.pcweek.ru/themes/detail.php?ID=69051
Offline xlink  
#3 Оставлено : 18 ноября 2010 г. 18:04:18(UTC)
xlink

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2010(UTC)
Сообщений: 14
Откуда: Москва

Прошу прокомментировать код, а именно строку омеченную ???

Вопрос: надо ли помещать CRL в список tempCerts для проверки или нет? В ваших примерах CRL в список не помещается. Он там нужен или нет? Или КриптоПро сама при построении цепочки подцепит CRL из корневого сертификата?

Отредактировано пользователем 18 ноября 2010 г. 18:06:01(UTC)  | Причина: Не указана

Offline Iva  
#4 Оставлено : 18 ноября 2010 г. 20:26:08(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Если Вы хотите проверять сертификат на отзыв со статическим CRL, то надо добавить CRL. И надо поставить
cpp.setRevocationEnabled(true);
В корневом сертификате нет CRL, поэтому КриптоПро не может сама при построении цепочки подцепить CRL оттуда.
Если Вы хотите чтоб стандартные java классы CertPathBuilder и CertPathValidator сами забирали CRL с CRLDP, то надо поставить
System.setProperty("com.sun.security.enableCRLDP", "true");
или
System.setProperty("com.ibm.security.enableCRLDP", "true");
в зависимости от Вашей java.
В нашем примере OCSPValidateCert проверка идет по OCSP протоколу, и CRL не нужен.
Подробнее читайте
http://download.oracle.c...h/CertPathProgGuide.html
Offline xlink  
#5 Оставлено : 19 ноября 2010 г. 2:40:21(UTC)
xlink

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2010(UTC)
Сообщений: 14
Откуда: Москва

Спасибо за ответы, Iva!

Давайте я еще раз проговорю, а вы поправите если что не так.

Есть три способа проверки валидности сертификата:

1) статический заранее полученный CRL. В этом случае при инициализации CertPathBuilder и CertPathValidator надо поместить crl в list

2) CertPathBuilder и CertPathValidator сами берут crl с crldp корневого сертификата. Необходимо использовать свойство enableCRLDP. crl при этом хранить не нужно.

3) через OCSP протокол

Я так понимаю плюс первого способа - производительность: crl можно периодически обновлять, при этом не надо каждый раз лезть в него по сети. Минус - период обновления должен быть маленьким, иначе есть риск подтверждения валидности отозванного сертификата, если локальный crl еще не обновился.

Второй и третий способы проще для реализации - не надо обеспечивать обновление и хранение crl. При этом запрос будет обрабатываться дольше.

Отредактировано пользователем 19 ноября 2010 г. 2:47:19(UTC)  | Причина: Не указана

Offline Iva  
#6 Оставлено : 19 ноября 2010 г. 14:54:02(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Да.
Offline xlink  
#7 Оставлено : 19 ноября 2010 г. 17:24:04(UTC)
xlink

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2010(UTC)
Сообщений: 14
Откуда: Москва

Сообщаю, что у меня работает приведенный в посте №1 вариант со статическим CRL без установки свойства

cpp.setRevocationEnabled(false);

Проверял на двух сертификатах (один валидный и один отозванный) - все работает.





При проверке динамического CRL получаю exception:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Код:

//---------------------

cpp = new PKIXBuilderParameters(trustSet, null);
cpp.setSigProvider(null);

List tempCerts = new LinkedList();
tempCerts.addAll(trustList);
tempCerts.add(certificate);

CollectionCertStoreParameters par = new CollectionCertStoreParameters(tempCerts);
CertStore store = CertStore.getInstance("Collection", par);
cpp.addCertStore(store);
X509CertSelector selector = new X509CertSelector();
selector.setCertificate((X509Certificate) certificate);
cpp.setTargetCertConstraints(selector);

cpp.setRevocationEnabled(true);
PKIXCertPathBuilderResult res = (PKIXCertPathBuilderResult) CertPathBuilder.getInstance("PKIX").build(cpp);
CertPath cp = res.getCertPath();
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
cpp.setRevocationEnabled(true);
cpv.validate(cp, cpp);

//---------------------

сертификат УЦ в доверенных присутствует, crl в браузере доступен. Свойства установлены:


javax.security.trustStore = C:\.keystore
javax.security.trustStorePassword = root
com.sun.security.enableCRLDP = true

В чем может быть проблема?

Отредактировано пользователем 22 ноября 2010 г. 15:59:43(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.