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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline serg2030  
#1 Оставлено : 5 сентября 2018 г. 11:28:54(UTC)
serg2030

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

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

Добрый день,

Есть ли в КриптоПро JCP готовый метод “из коробки” для проверки цепочки сертификатов до корневого с учетом списков отзыва (CRL), валидности сертификатов на данный момент времени, валидности подписей сертификатов и открытого ключа.

То есть, например, на входе дан некоторый сертификат, который ссылается на сертификат промежуточного УЦ (или нескольких), а тот в свою очередь ссылается на корневой (например ГУЦ). Необходимо проверить всю цепочку (подписи, CRL, действующие ли сертификаты?) до корневого. Приведите пожалуйста готовый работающий код или ссылку на скачивание его.

P.S. используем лицензированную версию КриптоПро JCP 2.x
Offline Евгений Афанасьев  
#2 Оставлено : 5 сентября 2018 г. 12:08:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте.
Попробуйте (пример из samples-sources.jar/userSamples, есть еще другой OCSPValidateCert)
Код:

/**
 * Пример построения и проверки цепочки сертификатов.
 * Построение выполняется путем загрузки необходимых
 * сертификатов из сети согласно сведениям AIA, при
 * этом задан сертификат проверки и корневой сертификат.
 * Проверка выполняется с помощью CRL DP в сертификатах.
 *
 * @author Copyright 2004-2018 Crypto-Pro. All rights reserved.
 * @.Version
 */
public class CRLValidateCert {

    /**
     * Путь к сертификатам.
     */
    private static final String PATH = "<path_to_certificates>";

    /**
     * Выполнение примера.
     *
     * @param args Параметры.
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        System.setProperty("com.sun.security.enableCRLDP", "true"); // для проверки по CRL DP
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети

        final CertificateFactory cf = CertificateFactory.getInstance("X509");

        final Certificate user = cf.generateCertificate(new FileInputStream(PATH + "user.cer"));
        Certificate root = cf.generateCertificate(new FileInputStream(PATH + "root.cer"));

        final Certificate[] certs = new Certificate[2];
        certs[0] = user;
        certs[1] = root;

        final Set<TrustAnchor> trust = new HashSet<TrustAnchor>(1);
        trust.add(new TrustAnchor((X509Certificate) root, null));

        final List cert = new ArrayList(0);
        for (int i = 0; i < certs.length; i++)
            cert.add(certs[i]);

        final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
        cpp.setSigProvider(null);

        final CollectionCertStoreParameters par =
            new CollectionCertStoreParameters(cert);

        final CertStore store = CertStore.getInstance("Collection", par);
        cpp.addCertStore(store);

        final X509CertSelector selector = new X509CertSelector();
        selector.setCertificate((X509Certificate) user);

        cpp.setTargetCertConstraints(selector);
        cpp.setRevocationEnabled(false);

        // Построение цепочки.

        final PKIXCertPathBuilderResult res =
            (PKIXCertPathBuilderResult) CertPathBuilder.
                getInstance("CPPKIX", "RevCheck").build(cpp);

        final CertPath cp = res.getCertPath();

        System.out.println("%%% SIZE: " + cp.getCertificates().size());
        System.out.println("%%% PATH:\n" + cp);
        System.out.println("OK-1");

        // Проверка цепочки.

        final CertPathValidator cpv = CertPathValidator.getInstance("CPPKIX", "RevCheck");
        cpp.setRevocationEnabled(true);

        cpv.validate(cp, cpp);
        System.out.println("OK-2");

    }

}

Пример строит цепочку от root до user, при этом выполняются проверки сертификатов, статус (CRL), отсутствующие сертификаты скачиваются (если есть ссылки на них в сертификатах). Если скачивание запрещено/невозможно, то нужно в cert подать нужные сертификаты для построения и скачанные заранее CRL.

Отредактировано пользователем 5 сентября 2018 г. 12:09:36(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
ВадимPilotnikov оставлено 29.11.2022(UTC)
Offline serg2030  
#3 Оставлено : 6 сентября 2018 г. 14:01:39(UTC)
serg2030

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

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

Спасибо! А выполняется ли проверка не истек ли сертификаты на данный момент времени?
Offline Евгений Афанасьев  
#4 Оставлено : 6 сентября 2018 г. 15:12:09(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Истек ли срок действия сертификата/CRL? Да, такая проверка есть.
Offline serg2030  
#5 Оставлено : 18 января 2019 г. 12:32:32(UTC)
serg2030

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

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

Здравствуйте,

А можно для кода выше отладочную трассировку как-нибудь включить? То есть на какой CRL URL он лезет и т.п.

p.s. используем платную версию
Offline Евгений Афанасьев  
#6 Оставлено : 18 января 2019 г. 12:36:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте.
JCPLogger с уровнем FINE и т.д. должен помочь: https://support.cryptopr...nlirovnija-kriptopro-jcp
Offline Capfunny  
#7 Оставлено : 21 января 2019 г. 15:28:05(UTC)
Capfunny

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

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

Сказал(а) «Спасибо»: 9 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Попробуйте (пример из samples-sources.jar/userSamples, есть еще другой OCSPValidateCert)


Евгений, подскажите пожалуйста, приведенный вами выше пример из samples-sources.jar/userSamples будет работать, если нет корневого сертификата?
Можно в данном алгоритме использовать только публичный?

Отредактировано пользователем 21 января 2019 г. 15:28:48(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 21 января 2019 г. 16:57:03(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Нет, не будет, trust anchors должен быть непустым. Если посмотреть метод setTrustAnchors класса PKIXParameters, то можно увидеть проверку:
Код:

public void setTrustAnchors(Set<TrustAnchor> trustAnchors)
        throws InvalidAlgorithmParameterException
    {
        if (trustAnchors == null) {
            throw new NullPointerException("the trustAnchors parameters must" +
                " be non-null");
        }
        if (trustAnchors.isEmpty()) {
            throw new InvalidAlgorithmParameterException("the trustAnchors " +
                "parameter must be non-empty");
        }
        for (Iterator<TrustAnchor> i = trustAnchors.iterator(); i.hasNext(); ) {
            if (!(i.next() instanceof TrustAnchor)) {
                throw new ClassCastException("all elements of set must be "
                    + "of type java.security.cert.TrustAnchor");
            }
        }
        this.unmodTrustAnchors = Collections.unmodifiableSet
                (new HashSet<TrustAnchor>(trustAnchors));
    }

Да, TrustAnchor может быть составлен и из других частей (с публичным ключом):
Код:

public TrustAnchor(X509Certificate trustedCert, byte[] nameConstraints) ...
public TrustAnchor(X500Principal caPrincipal, PublicKey pubKey, byte[] nameConstraints) ...
public TrustAnchor(String caName, PublicKey pubKey, byte[] nameConstraints) ...

В промежуточном сертификате может и не быть информации о корневом.

Отредактировано пользователем 21 января 2019 г. 16:59:12(UTC)  | Причина: Не указана

Offline Capfunny  
#9 Оставлено : 21 января 2019 г. 18:19:24(UTC)
Capfunny

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

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

Сказал(а) «Спасибо»: 9 раз
Спасибо, Евгений.

Еще вопрос:
А важен ли порядок следования сертификатов в списке, и что, если список будет содержать ещё и промежуточные сертификаты?
Offline Евгений Афанасьев  
#10 Оставлено : 21 января 2019 г. 19:12:39(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Важен только target-сентификат (EE-сертификат), для которого будет построена цепочка, а также список доверенных. Остальные (в том числе там могут быть, опять же, корневые, любые промежуточные и т.д.) подаются в любом порядке в addCertStore.

Отредактировано пользователем 21 января 2019 г. 19:13:44(UTC)  | Причина: Не указана

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