Общее
Я тут не буду растекаться мыслью по древу, объяснять, что такое CRL. Если Вы этого не понимаете, значит, Вам это не надо. Тем же несчастным ублюдкам, которые нырнули в мутное болото CryptoAPI, я посвещаю свой рассказ…
Отзыв
В PKI X509 самое узкое место – отзыв. Работа механизма отзыва в Windows довольно мутная тема, документация туманна. Экспериментальным путем установлено, что на факт признания OS отзыва сертификата влияют следующие вещи:
- Так называемый кеш отзыва – какие-то там файлы, размещенные в \Document and Settings\Username\Application Data\Microsoft\CryptnetUrlCache\Methadata
- CRL, размещенный локально – в Хранилище “Промежуточные УЦ”
- CRL, доступный по CDP – CRL Distibution Points. В сертификате указываются пути через SMB, HTTPS, LDAP и пр.
- Активность так называемых провайдеров отзыва, например OCSP
Работает эта вся хреновина примерно так: Серт пробивается по кешу. Если в кеше ничего нет – по локально установленным СОС (CRL). Если их нет, управление передается провайдеру отзыва по умолчанию (вставить путь в реестре и имя dll). Оный же злокачественный провайдер лезет по CDP, указанным в проверяемом сертификате, и пробует скачать свежеприготовленный CRL оттуда. Получив означенный, пробует пробить проверяемый сертификат по нему. Если CRL недоступен, и больше провайдеров нет, пишет – статус не определен. Если другие провайдеры зарегистрированы – управление передается им. Не ручаюсь за точность последовательности. Во-первых, она меняется от версии Windows и сервис-пака, во вторых, в самом MS, наверно, уже забыли, как оно работает. В этой теме секут ребята из Крипто-Про и вот я. На MSDN всего 2(!) ссылки по теме, правда, довольно дельных…
Зачем оно надо
А затем. Вы написали софт для работы с закрытой информацией. Удостоверяющий центр у Вас вообще не подключен к сети (что правильно),а CRL таскают на флешках. Доступа в ИНЕТ нет вообще. В общем, CDP недоступны. Каждый раз проставлять CRL всем абонентам или на серверную ферму из 89 стоечных единиц очень напряжно. Поэтому есть фирменные провайдеры, которые поддерживают OCSP, которые содержат собственно провайдер отзыва, регистрируемый на каждом сервере, и серверную часть. Вы можете воспользоваться этим решением, но, господа, не бесплатно. Не бесплатно! ![]()
Протоколы
Протоколов, помимо OCSP, масса. Первый протокол был бинарный, с использованием навоза ASN1.DER. Использование ASN1 не прибавляет конструкции ни простоты, ни защищенности. Дня, наверно, не проходит, чтоб его не натянули…Крайне неудачный формат, кто ж так обкурился, что такую байду заверстал…
Короче. Наплевать какой протокол Вы там гоняете между провайдером и ответной серверной частью. Я, например, гоняю ErlTlv – протокол бинарных термов Эрланга. Non compliant? Конечно. Без разницы мне. У меня корпоративная система, что хочу, то и прикручу.
Что есть провайдер
Провайдер, дети мои, как легко догадаться, суть DLL, регистрируемая в особом разделе реестра. Означенная DLL экспортирует одну функцию.Провайдеры регистрируются по стековому принципу. Где у стека голова, я, правда, так и не понял…
Функция принимает указатель на вагон параметров. Среди них важных два – количество сертификатов, подлежащих пробитию по CRL, и массив указателей на них. В 99% случаях Windows дергает DLL по одному серту за раз. WinVerifyTrust может дернуть пачкой. Ладно. Факт тот, что Вас дернули за пипу – проверяйте!
Функция должна закончить работу, вернуть FALSE и выставить SetLastError на том серте, на котором произошел первый облом. Там еще индекс передается, причина, в общем, их тоже выставить. Windows понимает следующие типы обломов:
CRYPT_E_REVOKED – сертификат был отозван
CRYPT_E_REVOCATION_OFFLINE – до сервера не достучаться, или внутренняя ошибка.
CRYPT_E_NO_REVOCATION_CHECK – сертификат не вашей системы, вы не хотите его проверять, вы не можете его проверять, в общем, отдать следующему в цепочке провайдеру (например – стандартному).
Там еще парочка каких-то мутных флагов, как они действуют,я не понял.
Моя реализация
Статус: в процессе тестирования. Язык реализации – плоский C. Внутренний протокол – Erl TLV. Клиент-сервер, CRL’ы загружаются тупо в папочку на сервере. Отдам за доброе слово (обращаться по адресу : killy@newmail.ru), если захотите.
Советы разработчикам
Для успешного написания, а главное, испытания своего провайдера рекомендую:
- На период тестирования заглушить все УЦ, убрать их из сети, поджечь и выбросить
- Регулярно очищать локальные файловые кеши
- Локально установленные CRL убрать.
- В функции построения цепочки выставлять параметр – таймаут доступа к CDP. Тогда стандартный провайдер по-быстрому обломиться, и управление передадут Вам.
- Сертификаты корневых УЦ обычно не отзывают:) Проверяйте передаваемый серт на self-signed.
- Анализируйте принадлежность серта к вашей системе – по OID’ам, политике, куску имени, в общем, проявите фантазию. Если серт не ваш, скажите системе об этом.
В общем, happy coding, регарды, peter631…
З.Ы.
Ссылочки.