Статус: Новичок
Группы: Участники
Зарегистрирован: 18.05.2017(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Добрый день!
Решаю задачу построения и проверки цепочки доверенных сертификатов и СОС на заданную дату. Конечный сертификат - тестовый УЦ КриптоПро, в нем указан CRLDP тестового УЦ. Построение и проверку осуществляю через CertPathBuilder. Столкнулась со следующей проблемой: если проверка проводится на дату, на которую все сертификаты валидны, но дата раньше, чем начало действия актуального СОС, то цепочка не строится с ошибкой:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Казалось бы, если сертификата нет в самом актуальном СОС, то и на более раннюю дату он не мог быть отозван. Подскажите пожалуйста, как правильно решить эту проблему.
И еще вопрос. В примерах есть такой код:
final CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); //или для совместимости с КриптоПро УЦ //CertPathBuilder cpb = CertPathBuilder.getInstance("CPPKIX");
В чем заключается особенность КриптоПро УЦ, где можно об этом почитать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Приведите пример, как строите и проверяете. Если CRL не укладывается в дату, которую вы задаете (CRL может иметь ограниченный срок), то он не валиден и использоваться не будет, а когда список CRL пуст (ни один не подошел), то можно получить примерно такую ошибку. CPPKIX - это, фактически, PKIX, рекомендуется использовать его (CPPKIX). Отредактировано пользователем 18 мая 2017 г. 11:00:41(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.05.2017(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Код:
System.setProperty("com.sun.security.enableCRLDP", signPkix.isOnlineRevocationEnabled()? "true" :"false");
try {
// Создаем селектор конечного сертификата в цепочке
X509CertSelector selector = new X509CertSelector();
selector.setCertificate(x509Certificate);
// хранилище доверенных корневых сертификатов
KeyStore trustedStore = signPkix.getTrustedStore();
// Конфигурация конечным сертификатом и доверенными сертификатами
PKIXBuilderParameters pkixParams =
new PKIXBuilderParameters(trustedStore, selector);
// инициализация объекта построения цепочки сертификатов
final CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
// здесь пустые коллекции
Set intermadiateCertsAndCrls = new HashSet();
intermadiateCertsAndCrls.addAll(signPkix.getIntermediateCertificates());
intermadiateCertsAndCrls.addAll(signPkix.getCrls());
pkixParams.addCertStore(CertStore.getInstance("Collection",
new CollectionCertStoreParameters(intermadiateCertsAndCrls)));
// устанавливаем вкл.выкл проверки СОС
// включено
pkixParams.setRevocationEnabled(signPkix.isRevocationEnabled());
// устанавливаем дату проверки
pkixParams.setDate(Date.from(verificationDate.toInstant()));
// построение цепочки сертификатов
final PKIXCertPathBuilderResult res =
(PKIXCertPathBuilderResult) cpb.build(pkixParams);
return true;
} catch (Exception ex) {
log.error("{}", ex);
return false;
}
Как я понимаю происходящее: 1. CRL скачивается по CRLDP из сертификата. 2. CRL не валиден на требуемую дату. Он новее. 3. В логике проверки не учитывается, что более новый CRL годится для ранних дат. Или это не так? 4. CRL отбрасывается. 5. Нет ни одного CRL. Проверка не успешна. Правильно? Как тогда решается моя задача? Надо иметь локально более ранние CRL-ы и включать их в построение или проверять цепочку на текущую дату, потом отключать проверку CRL и проверять на требуемую дату?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Автор: OKrutova ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Как я понимаю происходящее: 1. CRL скачивается по CRLDP из сертификата. 2. CRL не валиден на требуемую дату. Он новее. 3. В логике проверки не учитывается, что более новый CRL годится для ранних дат. Или это не так? 4. CRL отбрасывается. 5. Нет ни одного CRL. Проверка не успешна.
Правильно?
Как тогда решается моя задача? Надо иметь локально более ранние CRL-ы и включать их в построение или проверять цепочку на текущую дату, потом отключать проверку CRL и проверять на требуемую дату?
В samples-sources.jar есть пример OCSPValidateCert, можете его посмотреть. Если signPkix.isOnlineRevocationEnabled() = true, то да. Лучше, следуя примеру OCSPValidateCert, отдельно строить цепочку, используя pkixParams.setRevocationEnabled(false), а затем отдельно проверять с pkixParams.setRevocationEnabled(true). пп. 2-3 не очень понятны. Какая дата находится verificationDate и как она соотносится с датами thisUpdate и nextUpdate в CRL? Не понятно "более новый CRL годится для ранних дат": ранняя дата (видимо, verificationDate), это, допустим, 01.01.2017, а "более новый CRL" - это CRL с thisUpdate = 18.05.2017 и nextUpdate = 19.05.2017. Такой CRL будет невалиден, примерный код метода match стандартного класса java.security.cert.X509CRLSelector: Код:
/**
* Sets the dateAndTime criterion. The specified date must be
* equal to or later than the value of the thisUpdate component
* of the <code>X509CRL</code> and earlier than the value of the
* nextUpdate component. There is no match if the <code>X509CRL</code>
* does not contain a nextUpdate component.
* If <code>null</code>, no dateAndTime check will be done.
* <p>
* Note that the <code>Date</code> supplied here is cloned to protect
* against subsequent modifications.
*
* @param dateAndTime the <code>Date</code> to match against
* (or <code>null</code>)
* @see #getDateAndTime
*/
public void setDateAndTime(Date dateAndTime) {
if (dateAndTime == null)
this.dateAndTime = null;
else
this.dateAndTime = new Date(dateAndTime.getTime());
this.skew = 0;
}
Код:
/* match on dateAndTime */
if (dateAndTime != null) {
Date crlThisUpdate = xcrl.getThisUpdate();
Date nextUpdate = xcrl.getNextUpdate();
if (nextUpdate == null) {
if (debug != null) {
debug.println("X509CRLSelector.match: nextUpdate null");
}
return false;
}
Date nowPlusSkew = dateAndTime;
Date nowMinusSkew = dateAndTime;
if (skew > 0) {
nowPlusSkew = new Date(dateAndTime.getTime() + skew);
nowMinusSkew = new Date(dateAndTime.getTime() - skew);
}
if (nowMinusSkew.after(nextUpdate)
|| nowPlusSkew.before(crlThisUpdate)) {
if (debug != null) {
debug.println("X509CRLSelector.match: update out of range");
}
return false;
}
}
Для проверки нужны актуальные CRL на дату проверки. Отредактировано пользователем 18 мая 2017 г. 14:04:29(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.05.2017(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Спасибо, с CRL и их сроками действия все понятно. А вот это: Цитата: Лучше, следуя примеру OCSPValidateCert, отдельно строить цепочку, используя pkixParams.setRevocationEnabled(false), а затем отдельно проверять с pkixParams.setRevocationEnabled(true).
почему лучше, чем сразу построить цепочку с проверкой CRL?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
В некоторых случаях приоритетнее построить цепочку, а не проверить, в указанном примере ошибка будет выдана в том случае, если есть проблемы с проверкой, и цепочка может быть незаполнена. |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close