Слишком высокий уровень ошибки в логе при невалидном handshake со стороны клиента

spleenjack nginx-forum at nginx.us
Mon Sep 1 12:54:47 UTC 2014


Пару дней назад в error.log в огромных количествах начали сыпаться вот такие
записи (ip клиента заменил):

2014/09/01 12:36:02 [crit] 13175#0: *46423402 SSL_do_handshake() failed
(SSL: error:05066066:Diffie-Hellman routines:COMPUTE_KEY:invalid public key
error:1408B005:SSL routines:SSL3_GET_CLIENT_KEY_EXCHANGE:DH lib) while SSL
handshaking, client: 1.1.1.1, server: 0.0.0.0:443

Подампили трафик. Если я всё правильно понял исходя из собранных пакетов,
сервер отправляет клиенту выбранный cipher suite - в нашем случае Cipher
Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039). И посылает 1024 битный
pubkey для DH. Клиент, в ответ на это, присылает свой pubkey, но уже
неправильного размера - 2048 бит. Серверу это не нравится и он сбрасывает
соединение.

Я не настоящий сварщик, но смог раскопать openssl-ный код вот досюда -
модуль crypto/dh/dh_check.c, функция DH_check_pub_key:

131     if (BN_cmp(pub_key,q)<=0)
132         *ret|=DH_CHECK_PUBKEY_TOO_SMALL;

135     if (BN_cmp(pub_key,q)>=0)
136         *ret|=DH_CHECK_PUBKEY_TOO_LARGE;

Эта функция вызывается из compute_key модуля crypto/dh/dh_key.c.

Всё бы хорошо, но nginx в такой ситуации отписывает в error.log о каждом
сброшенном соединении с уровнем [crit]. То есть, выставленный уровень
фильтрации [error] в nginx.conf не помогает игнорировать такие ошибки и у
нас срабатывает мониторинг. Ну ладно, фиг с ним, с мониторингом, но лог
начинает сильно пухнуть в размерах.

Кажется, что уровень ошибки на самом деле не такой критичный. Иначе,
получается, что на сервере с обработкой хендшейка всё хорошо, но если
прицельно запулнуть в сервер кривыми пакетами, он может написать в лог
много-много гигабайт и сожрать весь диск.

Можно понизить уровень этих ошибок до info или вообще debug?

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,252989,252989#msg-252989



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