Openssl - Как проверить, отменен ли сертификат или нет

С библиотекой OpenSSL, как я могу проверить, отменен ли сертификат одноранговой сети или нет. Из того, что я googled:

  • x509 cerfiticate содержит набор точек распределения crl, т.е. набор URL-адресов
  • скачать crl из этих URL-адресов
  • crl содержит серийные номера отозванных сертификатов
  • если в списке crl есть серийный номер сертификата партнера, он отменяется

Какие API OpenSSL я использую для этого? Кроме того, это правильный способ проверить, отменен ли сертификат или нет?

Ответы

Ответ 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 внутри вашей программы.