Реми ван Элст. Вшивание OCSP в nginx, 2014

Перевод статьи: OCSP Stapling on nginx

Автор: Реми ван Элст (Remy van Elst)

При подключении к серверу, клиент должен проверить действительность сертификата сервера по списку отозванных сертификатов - CRL, или по протоколу интерактивного статуса сертификата - OCSP. Проблема CRL заключается в том, что списки могут вырасти до огромных размеров и скачивание может затянуться на вечность.

OCSP намного легче, поскольку за один раз запрашивается одна запись. Но недостаток состоит в том, что при подключении к серверу нужно выполнить OCSP-запрос к стороннему ответчику, что увеличивает задержку и может оказаться причиной сбоев. Фактически, ответчики OCSP управляются удостоверяющим центром, недоступность которого для браузера приведёт к ошибке, если ответ не будет получен своевременно. Это уменьшает безопасность, позволяя атакующему наводнить запросами ответчик OCSP, чтобы отключить проверку.

Решение заключается в том, чтобы разрешить серверу отправлять в процессе рукопожатия TLS запись OCSP из кэша, так чтобы не затрагивать ответчика OCSP. Этот механизм избавляет клиента от необходимости связываться с ответчиком OCSP и называется вшиванием OCSP.

Сервер посылает ответ OCSP из кэша только если клиент его запрашивает, сообщая в CLIENT HELLO о поддержке расширения TLS status_request.

Большинство серверов сохраняют в кэш OCSP-ответы на 48 часов. Через регулярные интервалы времени сервер будет подключаться к ответчику OCSP удостоверяющего центра, чтобы получить свежую запись OCSP. Расположение ответчика OCSP берётся из подписанного сертификата, из поля Authority Information Access - доступ к информации о подлинности.

Это руководство также доступно для Apache.

1. Что такое "вшивание OCSP"?

Вшивание OCSP определено в IETF RFC 6066. "Вшивание" - это популярное слово, используемое для объяснения принципа получения OCSP-ответа от веб-сервера. Веб-сервер помещает в кэш ответ от удостоверяющего центра, выпустившего сертификат. В процессе рукопожатия SSL/TLS веб-сервер возвращает клиенту ответ, к которому прикладывает OCSP-ответ из кэша в поле CertificateStatus со статусом сертификата. Для использования вшивания OCSP клиент должен включить расширение status_request в приветствии SSL/TSL.

Вшивание OCSP имеет несколько дополнительных плюсов:

Обратитесь за дополнительной информацией об OCSP и вшивании OCSP по одной из следующих ссылок:

2. Требования

Необходим nginx версии не ниже 1.3.7. Эта версия не доступна в текущем релизе Ubuntu LTS (12.04), где есть только 1.1.19, а в CentOS нужен EPEL или официальные репозитории. Однако, установить последнюю версию nginx довольно легко.

Также нужно создать исключение в пакетном фильтре, чтобы разрешить веб-серверу совершать исходящие подключения к вышестоящим серверам OCSP. URI OCSP веб-сайта можно увидеть при помощи следующей команды:

OLDIFS=$IFS; \
IFS=':' certificates=$(openssl s_client -connect google.com:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null \
 | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); \
for certificate in ${certificates#:}; do \
 echo $certificate | openssl x509 -noout -ocsp_uri; \
done; \
IFS=$OLDIFS

Вот результаты для google.com:

http://clients1.google.com/ocsp
http://gtglobal-ocsp.geotrust.com

3. Конфигурация nginx

Добавьте следующую конфигурацию в блок server с настройками https (443):

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Чтобы вшивание OCSP заработало, должен быть известен эмитент сертификата сервера. Если файл ssl_certificate не содержит промежуточных сертификатов, сертификат эмитента сертификата сервера должен быть представлен в файле ssl_trusted_certificate.

Мой сертификат для raymii.org выпущен удостоверяющим центром Positive CA 2. Этот сертификат выпущен корневым удостоверяющим центром Addtrust External CA Root. В файле, указанном в директиве ssl_certificate, должны присутствовать оба сертификата. Если в вашем случае это не так, создайте файл с цепочкой сертификатов и используйте его следующим образом:

ssl_trusted_certificate /etc/ssl/certs/domain.chain.stapling.pem;

До версии 1.1.7 можно было настроить только одно имя сервера. Указание имени серверов с помощью адресов IPv6 поддерживается, начиная с версий 1.3.1 и 1.2.2. По умолчанию nginx будет искать и адреса IPv4 и IPv6. Если поиск адресов IPv6 не желателен, можно указать параметр ipv6=off. Решение имён в адреса IPv6 поддерживается начиная с версии 1.5.8.

По умолчанию nginx помещает ответы в кэш, используя значение TTL из ответа. Необязательный параметр valid позволяет заменить его на 5 минут. До версии 1.1.9 настройка времени кэширования была невозможной и nginx всегда помещал ответы в кэш на 5 минут.

Перезапустите nginx, чтобы загрузить новую конфигурацию:

service nginx restart

Теперь всё должно заработать. Давайте проверим.

4. Тестирование

Откройте терминал и воспользуйтесь следующей командой OpenSSL для подключения к вашему веб-сайту:

openssl s_client -connect example.org:443 -tls1 -tlsextdebug -status

В ответе обратим внимание на следующее:

OCSP response:                                                   # Ответ OCSP:
======================================
OCSP Response Data:                                              #     Данные ответа OCSP
    OCSP Response Status: successful (0x0)                       #     Статус ответа OCSP: успешно (0x0)
    Response Type: Basic OCSP Response                           #     Тип ответа: Базовый ответ OCSP
    Version: 1 (0x0)                                             #     Версия: 1 (0x0)
    Responder Id: 99E4405F6B145E3E05D9DDD36354FC62B8F700AC       #     Идентификатор ответчика
    Produced At: Feb 3 04:25:39 2014 GMT                         #     Сформирован: 3 февраля 2014 года в 04:25:39 по Гринвичу
    Responses:                                                   #     Ответы:
    Certificate ID:                                              #     Идентификатор сертификата:
      Hash Algorithm: sha1                                       #       Алгоритм хэширования: sha1
      Issuer Name Hash: 0226EE2F5FA2810834DACC3380E680ACE827F604 #       Хэш имени эмитента
      Issuer Key Hash: 99E4405F6B145E3E05D9DDD36354FC62B8F700AC  #       Хэш ключа эмитента
      Serial Number: 1003                                        #       Серийный номер
    Cert Status: good                                            #     Статус сертификата: хороший
    This Update: Feb 3 04:25:39 2014 GMT                         #     Это обновление: 3 февраля 2014 года в 04:25:39 по Гринвичу
    Next Update: Feb 7 04:25:39 2014 GMT                         #     Следующее обновление: 7 февраля 2014 года в 04:25:39 по Гринвичу

Этот ответ означает, что всё работает. Если получен ответ, подобный следующему, то это значит что вшивание OCSP не работает:

OCSP response: no response sent # OCSP-ответ: ответ не получен

Вы также можете воспользоваться проверкой SSL Labs, чтобы проверить, что вшивание OCSP работает.

5. Источники

Написать автору перевода