Пару дней назад в 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?