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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline OKrutova  
#1 Оставлено : 18 мая 2017 г. 10:41:19(UTC)
OKrutova

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.05.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 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");

В чем заключается особенность КриптоПро УЦ, где можно об этом почитать?
Offline Евгений Афанасьев  
#2 Оставлено : 18 мая 2017 г. 10:59:54(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Приведите пример, как строите и проверяете. Если CRL не укладывается в дату, которую вы задаете (CRL может иметь ограниченный срок), то он не валиден и использоваться не будет, а когда список CRL пуст (ни один не подошел), то можно получить примерно такую ошибку. CPPKIX - это, фактически, PKIX, рекомендуется использовать его (CPPKIX).

Отредактировано пользователем 18 мая 2017 г. 11:00:41(UTC)  | Причина: Не указана

Offline OKrutova  
#3 Оставлено : 18 мая 2017 г. 11:23:24(UTC)
OKrutova

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.05.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 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 и проверять на требуемую дату?
Offline Евгений Афанасьев  
#4 Оставлено : 18 мая 2017 г. 13:59:36(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Автор: OKrutova Перейти к цитате

Как я понимаю происходящее:
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)  | Причина: Не указана

Offline OKrutova  
#5 Оставлено : 18 мая 2017 г. 14:23:23(UTC)
OKrutova

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.05.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Спасибо, с CRL и их сроками действия все понятно.
А вот это:
Цитата:

Лучше, следуя примеру OCSPValidateCert, отдельно строить цепочку, используя pkixParams.setRevocationEnabled(false), а затем отдельно проверять с pkixParams.setRevocationEnabled(true).

почему лучше, чем сразу построить цепочку с проверкой CRL?
Offline Евгений Афанасьев  
#6 Оставлено : 18 мая 2017 г. 14:48:15(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
В некоторых случаях приоритетнее построить цепочку, а не проверить, в указанном примере ошибка будет выдана в том случае, если есть проблемы с проверкой, и цепочка может быть незаполнена.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
OKrutova оставлено 18.05.2017(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.