OCSP stapling in Nginx >=1.3.7

Maxim Dounin mdounin на mdounin.ru
Вт Сен 11 15:59:20 UTC 2018


Hello!

On Tue, Sep 11, 2018 at 05:40:19PM +0300, Gena Makhomed wrote:

> On 11.09.2018 15:38, Maxim Dounin wrote:
> 
> >>> Лучше всего - сделать так, чтобы OpenSSL научился проверять
> >>> OCSP-ответы не полной цепочкой сертификатов вплоть до доверенного
> >>> root'а, а ровно так, как и должно быть по стандарту - с помощью
> >>> одного только сертификата issuer'а.  Тогда проблема исчезнет.
> 
> >> А разработчики OpenSSL разве знают об этой проблеме?
> >> На гитхабе https://github.com/openssl/openssl/issues
> >> я не нашел issue в которой бы описывалась эта проблема.
> 
> > О проблеме писалось ещё до того, как OpenSSL переехал на github,
> > и вроде бы даже был тикет на rt.openssl.org про это.
> > Но я не следил, и не планирую.
> 
> > Этим летом в кои-то веки документировали саму функцию
> > OCSP_basic_verify(), используемую для проверки OCSP-ответов.  И
> > если самого факта недостаточно для понимания проблемы, то стоит
> > прочитать эту самую документацию, она доставляет.
> 
> Почитал документацию
> https://www.openssl.org/docs/manmaster/man3/OCSP_basic_verify.html
> там говорится о флаге OCSP_TRUSTOTHER, смысл примерно такой:
> 
> : ... or if the signer certificate was found in certs and
> : the flags contain OCSP_TRUSTOTHER. Otherwise the function
> : continues by validating the signer certificate.
> 
> О том же написано и в CHANGELOG:
> 
>    *) New OCSP verify flag OCSP_TRUSTOTHER. When set the "other"
>       certificates passed by the function are trusted implicitly.
>       If any of them signed the response then it is assumed
>       to be valid and is not verified.
> 
> Насколько я понимаю, это и есть та самая проверка с помощью
> одного только сертификата issuer'а, о которой Вы говорите?
> 
> Если это то, что надо, то сейчас уже ничто не мешает сделать
> в nginx директиву ocsp_stapling_verify включенной по-умолчанию?
> И для ее работы не нужно будет прописывать ssl_trusted_certificate?

В зависимости от того, каким сертификатом подписан OCSP-ответ - 
этого может быть достаточно или нет.  RFC 6960 допускает два 
варианта подписи в OCSP-ответах:

- issuer подписывает OCSP-ответ сам; или
- issuer выпускает сертификат, которым подписываются OCSP-ответы 
  (и этот сертификат включается в OCSP-ответ).

В обоих случаях для проверки OCSP-ответа достаточно знать 
issuer'а, однако второй случай в OpenSSL не работает (впрочем, я 
давно не порверял; но если верить "документации", в этом месте 
ничего не зименилось).  При этом по понятным причинам мало кто 
использует собственно CA для подписи OCSP-ответов, соответственно 
не работает это приблизительно всегда.

> >> Но даже если вдруг новые версии OpenSSL научатся проверять OCSP-ответы
> >> с помощью одного только сертификата issuer'а - проблема не исчезнет.
> 
> >> Потому что останется огромное количество операционных систем,
> >> в которых будет установлена старая версия OpenSSL, например,
> >> CentOS/RHEL. Новые версии этой системы выходят очень редко.
> 
> >> И потребуется как минимум 5-10 лет, прежде чем новые версии
> >> OpenSSL вытеснят старые версии OpenSSL из всех дистрибутивов.
> 
> > Никто не мешает не использовать OCSP stapling.  Либо же не
> > использовать ocsp_stapling_verify.  При разумном поведении
> > браузеров - от отсутствия проверки на стороне nginx'а проблем быть
> > не должно.  Если же браузеры по какой-то причине предпочитают
> > вести себя неразумно - что ж, это их выбор.
> 
> ocsp_stapling_verify в nginx можно без проблем использовать
> и прямо сейчас, только для этого надо прописать дополнительно
> ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
> 
> Насколько я понял из предыдущего обсуждения, нет разумных причин,
> чтобы выключать использование OCSP stapling и ocsp_stapling_verify.
> 
> И вместе с тем, есть причины, чтобы их включать:
> OCSP stapling - сайт у клиентов будет открываться быстрее.
> ocsp_stapling_verify - не будет проблем с неразумными браузерами.

Про "быстрее" - есть нюансы.  В частности, OCSP-ответ отправляется 
клиенту, пытающемуся использовать OCSP stapling, в каждом 
SSL handshake'е (а это местами может быть больно с точки зрения latency, не 
говоря уже про трафик), в то время как в значительной части 
случаев он клиенту на самом деле не нужен (например, уже есть в 
кэше).

Про verify - тоже есть нюансы.  Дискуссия, если я её правильно 
понял, как раз о том, что включать verify обходится дороже с 
административной точки зрения, чем хотелось бы.  При этом плюсы - 
призрачны, ибо защищают от атак, которых на практике не бывает 
(а если бы они были - браузеры бы давно исправились).

Единственное несомненное преимущество OCSP stapling'а - это 
меньшая нагрузка на инфраструктуру CA.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru