Перевод статьи: 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.
Вшивание OCSP определено в IETF RFC 6066. "Вшивание" - это популярное слово, используемое для объяснения принципа получения OCSP-ответа от веб-сервера. Веб-сервер помещает в кэш ответ от удостоверяющего центра, выпустившего сертификат. В процессе рукопожатия SSL/TLS веб-сервер возвращает клиенту ответ, к которому прикладывает OCSP-ответ из кэша в поле CertificateStatus со статусом сертификата. Для использования вшивания OCSP клиент должен включить расширение status_request в приветствии SSL/TSL.
Вшивание OCSP имеет несколько дополнительных плюсов:
Обратитесь за дополнительной информацией об OCSP и вшивании OCSP по одной из следующих ссылок:
Необходим 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
Добавьте следующую конфигурацию в блок 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
Теперь всё должно заработать. Давайте проверим.
Откройте терминал и воспользуйтесь следующей командой 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 работает.