Назад | Перейти на главную страницу

В журнале ошибок nginx: «SSL_BYTES_TO_CIPHER_LIST: недопустимый откат»

Недавно мы изменили конфигурацию nginx для поддержки TLSv1.2, а также ряда более безопасных шифров. После изменения наши журналы ошибок nginx были заполнены следующими ошибками:

2015/01/28 23:55:57 [критический] 16898 # 0: * 18712916 Ошибка SSL_do_handshake () (SSL: ошибка: 140A1175: подпрограммы SSL: SSL_BYTES_TO_CIPHER_LIST: недопустимый откат) во время установления связи SSL, клиент: ..., сервер: 0.0.0.0:443

Наша конфигурация nginx выглядит следующим образом:

server {
  root   /var/www/fl/current/public;

  listen              443;
  ssl                 on;
  ssl_certificate     /etc/nginx/ssl/wildcard.pem;
  ssl_certificate_key /etc/nginx/ssl/wildcard.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;

Мы получили несколько писем о том, что пользователи не могут получить доступ к сайту. Один пользователь сказал, что это ошибка, которую они получают в Firefox:

Безопасное соединение не удалось

Ошибка при подключении к ******. Com. Сервер отклонил квитирование, потому что клиент перешел на более низкую версию TLS, чем поддерживает сервер. (Код ошибки: ssl_error_inappinent_fallback_alert)

Страница, которую вы пытаетесь просмотреть, не может быть отображена, потому что не удалось проверить подлинность полученных данных.

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

Теперь мы получили оценку «A» в тесте Qualys SSL Server Test, поэтому я не решаюсь вернуться к нашей старой конфигурации.

Браузеры обычно подтверждают SSLv23. Этим рукопожатием они объявляют лучшую версию протокола, которую они поддерживают (сегодня в основном это TLS1.2), но не ограничивают сервер этой версией. Таким образом, сервер, который имеет правильно реализованный и настроенный стек TLS, но поддерживает только TLS1.0, просто ответит TLS1.0, и соединение будет успешным с первой попытки.

Но есть некоторые плохие стеки TLS или неправильная конфигурация или некоторые плохие промежуточные блоки (балансировщик нагрузки и т. Д.) На стороне серверов, которые приводят к сбою этого рукопожатия SSLv23. В этих случаях браузеры понижают версию протокола, используемого в рукопожатии, то есть они пытаются использовать явное рукопожатие TLS1.0, за которым следует явное рукопожатие SSL3.0 (некоторые браузеры уже отключили SSL3.0 и поэтому не пробуют это делать).

Новые браузеры будут использовать псевдошифр TLS_FALLBACK_SCSV, если они сделают такое соединение с пониженной версией. Если сервер, способный к TLS_FALLBACK_SCSV, обнаруживает пониженное соединение с более низкой версией протокола, которую он поддерживает (например, при понижении уровня используется TLS1.0, но сервер поддерживает TLS1.2), он предполагает, что происходит атака, подобная POODLE, и закрывает соединение.

Но почему клиент вообще может перейти на более раннюю версию при обращении к вашему серверу?

  • У вас может быть сломанный балансировщик нагрузки впереди, который вызывает сбои с некоторыми запросами.
  • Ваш сервер или какое-то устройство против DOS впереди может просто закрыть соединения при высокой нагрузке до завершения подтверждения SSL. В этом случае браузер примет решение о проблеме с протоколом и повторите попытку с более ранней версией.
  • Любые другие проблемы, такие как нехватка памяти и т. Д., Которые могут вызвать случайное закрытие в рамках рукопожатия SSL.

Для изменения 318904 был загружен связанный патч (от BBlack): некритический для подтверждения связи клиента SSL_R_VERSION_TOO_LOW

https://gerrit.wikimedia.org/r/318904

https://phabricator.wikimedia.org/T148893