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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline lesha_red  
#1 Оставлено : 15 июня 2023 г. 11:27:37(UTC)
lesha_red

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

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

Сказал(а) «Спасибо»: 2 раз
1. Пытаюсь получить цепочку сертификатов для сертификата, у которого отсутствует корневой, с помощью CertGetCertificateChain с параметром CERT_CHAIN_REVOCATION_CHECK_CHAIN. Ожидаемо получаю ошибки: CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_REVOCATION_STATUS_UNKNOWN, CERT_TRUST_IS_OFFLINE_REVOCATION;

2. Добавляю корневой сертификат в хранилище ROOT (текущего юзера) с помошью CertAddCertificateContextToStore (предварительно корректно открывая и закрывая хранилище);

3. Повторно вызываю CertGetCertificateChain и получаю те же ошибки, что и в п. 1.

Если после п.2 добавить sleep(100 msecs), то все работает корректно. Такое ощущение, что либо CertGetCertificateChain что-то кратковременно кеширует, либо CertAddCertificateContextToStore асинхронно обновляет хранилище. Пробовал CertControlStore с параметром CERT_STORE_CTRL_COMMIT - не помогает.

Windows 10, CryptoPro-5.0.12800.exe, но тестировщики наблюдают эту ошибку и с другими версиями.

Отредактировано пользователем 15 июня 2023 г. 11:29:23(UTC)  | Причина: Не указана

Offline Зубов Иван  
#2 Оставлено : 15 июня 2023 г. 14:35:14(UTC)
Зубов Иван

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

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

Сказал «Спасибо»: 14 раз
Поблагодарили: 31 раз в 28 постах
Здравствуйте!

CryptoAPI на Windows реализовано не нами, так что всех деталей про их реализацию мы, увы, не знаем.

В порядке мозгового штурма могу набросить пару идей. Идеи не проверял, просто озвучиваю.

1. Функция CertResyncCertificateChainEngine сбрасывает кэши chain engine. Если вы явно не передавали в CertGetCertificateChain chain engine, то неявно использовали chain engine по умолчанию:
[in, optional] hChainEngine
A handle of the chain engine (namespace and cache) to be used. If hChainEngine is NULL, the default chain engine, HCCE_CURRENT_USER, is used. This parameter can be set to HCCE_LOCAL_MACHINE.
Возможно, его кэши можно сбросить через CertResyncCertificateChainEngine.

2. Возможно, создание своего chain engine через CertCreateCertificateChainEngine и его использование в CertGetCertificateChain может вам помочь. Возможно, на этот хэндл тоже надо будет вызывать CertResyncCertificateChainEngine.
Техническую поддержку оказываем тут
Наша база знаний
Offline lesha_red  
#3 Оставлено : 15 июня 2023 г. 15:30:13(UTC)
lesha_red

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день, спасибо за ответ!

п.1 - казалось бы, как раз то что нужно, но не работает.

п.2 - вроде работает, но нет понимания, почему это помогло) Я создаю chain engine с хранилищами, аналогичными тем, что в chain engine по умолчанию (HCCE_CURRENT_USER), это по идее не должно влиять на результат. Возможно, там внутри где-то есть просто sleep(...), который и так помогает (если собирать в дебаге, то тоже все работает без приседаний).

UPD: п. 2 - если создаю chain engine, но не использую ее в CertGetCertificateChain, то тоже помогает)

Отредактировано пользователем 15 июня 2023 г. 15:56:05(UTC)  | Причина: Не указана

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