Ответ 1
К сожалению, API проверки CRL в OpenSSL не очень высокоуровневый, поэтому у вас есть код, выполняющий многие операции самостоятельно.
Краткий обзор того, что необходимо:
- Получить URL-адрес CRL из сертификата для подтверждения из расширения точек распространения CRL. OpenSSL предоставляет функции анализа синтаксиса, но не имеет простого доступа к точкам распространения CRL.
- Загрузить CRL из URL. OpenSSL не реализует это, ни какую-либо форму кеширования.
- Проверить CRL (подпись, DN эмитента, срок действия, идентификатор ключа объекта и т.д.). OpenSSL предоставляет различные низкоуровневые функции.
- Убедитесь, что серийный номер проверяемого сертификата находится в CRL.
Конечно, это должно быть сделано после проверки того, что сам сертификат является "действительным" в том смысле, что он выдается доверенным (или заслуживающим доверия) ЦС, он имеет правильные расширения использования и что он (вместе со своим доверием цепь) находится в пределах срока действия. В OpenSSL есть некоторые функции низкого и среднего уровня, которые помогут в этом.
Некоторые дополнительные сведения, которые могут усложнить для полностью общей реализации:
- Некоторые сертификаты могут использовать OCSP вместо CRL.
- В некоторых сертификатах в качестве точек распространения есть DN или LDAP LDAP.
- Некоторые CRL подписываются делегированным подписчиком CRL.
- Delta-CRL или секционированные CRL могут усложнить реализацию (особенно кэширование w.r.t.).
- и др.
RFC 5280 описывает полный алгоритм проверки PKIX. Вам не нужно выполнять все, но это хорошая ссылка, чтобы проверить, что вы не забываете что-то важное. Вы должны посмотреть модуль mod_ssl
(содержащийся в сервере Apache httpd
) для реализации, которая проверяет локальный CRL и реализует проверку OCSP.
Если вы заранее знаете, на какие CA вы доверяете (с точки зрения безопасности лучше), тогда вы могли бы загружать и обновлять CRL задания cron. Это избавило бы вас от реализации части, связанной с локализацией/загрузкой/кэшированием CRL внутри вашей программы.