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

Я получаю сообщение об ошибке: SSL3_GET_RECORD: расшифровка не удалась или запись mac плохая

У меня есть собственный сервер (на котором я запускаю Apache/2.4.27), и сегодня я понял, что (Brave и Google Chrome - разные компьютеры) я получаю со своих сайтов эту ошибку;

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

И что странно, я получаю эту ошибку каждый пятый щелчок по моему сайту.

Из моего файла conf:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mywebsite/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mywebsite/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mywebsite/chain.pem
SSLCompression off

из options-ssl-apache.conf;

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

Я проверил файл журнала с веб-сайта, но ничего, здесь тоже ничего; /var/log/apache2/error.log

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

РЕДАКТИРОВАТЬ:

Если я попробую openssl s_client -connect mywebsite.com:443, он вернет:

Я использую: OpenSSL 1.1.0f

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

ДРУГОЙ РЕДАКТИРОВАНИЕ:

Как предложил @quadruplebucky, я изменил options-ssl-apache.conf на:

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite           HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
SSLHonorCipherOrder     on
SSLCompression          off

#SSLSessionTickets       off

Я тоже пытался добавить SSLProtocol all -SSLv2 -SSLv3 в мой файл конфигурации виртуального хоста, и в то же время я изменил здесь пару вещей; /etc/apache2/mods-available/ssl.conf

#SSLCipherSuite HIGH:!aNULL
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

SSLHonorCipherOrder on

#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported
SSLProtocol all -SSLv2 -SSLv3

РЕДАКТИРОВАТЬ:

После изменения LogLevel на Info он возвращает:

[Sat Jul 08 13:34:53.374307 2017] [ssl:info] [pid 8710] [client] AH02008: SSL library error 1 in handshake (server mywebsite:443)
[Sat Jul 08 13:34:53.374717 2017] [ssl:info] [pid 8710] SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message
[Sat Jul 08 13:34:53.374750 2017] [ssl:info] [pid 8710] [client] AH01998: Connection closed to child 1 with abortive shutdown (server mywebsite:443)

РЕДАКТИРОВАТЬ:

Если я запускаю с параметром -crlf, например:

openssl s_client -crlf -connect mywebsite:443

Я не получаю ошибки?

Еще одна вещь, если я изменю LogLevel на отладку, перед этой ошибкой я получаю следующее:

[Tue Jul 11 23:00:38.641568 2017] [core:debug] [pid 26561] protocol.c(1273): [client 188.64.25.162:23165] AH00566: request failed: malformed request line
[Tue Jul 11 23:00:38.641634 2017] [headers:debug] [pid 26561] mod_headers.c(900): AH01503: headers: ap_headers_error_filter()

Итак, после этого произойдет та же ошибка:

SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message

openssl version
OpenSSL 1.1.0f  25 May 2017

Вы не можете сказать по этой ошибке, согласовывает ли ваш сервер SSLv3 или TLSv1 (возможно, вы захотите взглянуть на этот вопрос по Unix и Linux и убедитесь, что он отключен где угодно в apache ...) --- исходный код 1.1.0f здесь, на GitHub намеренно размывает два ...

   if (enc_err < 0) {
    /*
     * A separate 'decryption_failed' alert was introduced with TLS 1.0,
     * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
     * failure is directly visible from the ciphertext anyway, we should
     * not reveal which kind of error occurred -- this might become
     * visible to an attacker (e.g. via a logfile)
     */
    al = SSL_AD_BAD_RECORD_MAC;
    SSLerr(SSL_F_SSL3_GET_RECORD,
           SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
    goto f_err;
}

Так что вы можете захотеть изменить порядок своего набора шифров:

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

Этот пост на askubuntu об уязвимости POODLE имеет отличный список ресурсов для проверки SSL и сантехники.

Генератор конфигурации Mozilla является превосходно Государственная служба.

Комментарий "получение этой ошибки каждый пятый щелчок" немного странный. Ты имеешь ввиду щелчки, или каждая пятая строка - это плохой запрос в логах? Попробуйте запустить однопоточный apache (флаг -X) и посмотрите, делает ли это то же самое ... или, возможно, настройте SSLSessionTickets off.

Я думаю здесь, чтобы исключить потоки и согласованность / согласованность сеанса / кеша как источник проблем. Однопоточный запуск apache (запуск с флагом -X) - один из способов добиться этого, другой способ - установить MaxClients=1 (по крайней мере, с моделью MPM). Сеансовые билеты были источником проблем в прошлом с TLSv1.2, и они включены по умолчанию, это причина SSLSessionTickets off (обратите внимание, что это часть сообщения SSL «Server Hello», а не файл cookie сеанса или что-то подобное). Ошибка «каждый пятый щелчок» все еще беспокоит меня - я не могу не заметить, что большинство браузеров будут обрабатывать четыре запроса ресурсов в одном ...) и открывать новое соединение (новое подтверждение ssl и т.д.). для пятого ... без захвата пакета сложно сказать, что на самом деле происходит.

Казалось бы, вы устранили согласование шифра как источник ошибки (если я не ошибаюсь, вы можете продублировать условие ошибки при гораздо более строгих спецификациях шифра). Мне было бы любопытно узнать, можете ли вы вызвать ошибку, повторно согласовав SSL (например, просто для удовольствия): openssl s_client -connect server:443 а затем введите «R» и посмотрите, что написано в журналах.
Также посмотрите, работает ли кеширование сеанса с -reconnect опция для s_client.
Что-то контексты приема для SSL-запросов должны отличаться, и кажется, что лучший способ понять это (не считая побайтовой проверки того, что происходит по сети, что может быть трудно анонимизировать), - это строго ограничить размер того, что слушает (то есть количество слушателей).

Я бы попробовал другие инструменты отладки (при условии, что отправка захвата пакетов исключена ....)
- ssltaplibnss3-tools на убунту)
- шифрование
- sslscan

ОБНОВИТЬ
Тыкаю в это через ssltap очень похоже на Ошибка OpenSSL # 3712 снова всплыла (в основном, повторное согласование ключей во время чтения / записи). Ищете достойный обходной путь, который не убьет производительность. Веселая штука!

Я видел это раньше, было это раньше.

В моем случае ответ оказался очень тонким.

Сетевой адаптер включил разгрузку сегмента TCP, которая из-за какой-либо ошибки искажала (или усекала, не могла вспомнить) последние несколько байтов некоторых сообщений, что впоследствии приводило к сбою MAC в записях SSL.

Это была виртуальная машина на VMWare.

Я бы попробовал отключить TSO / GSO / GRO в вашей среде и посмотреть, исчезнет ли проблема.

ethtool -K eth0 tso off gro off gso off ufo off

Есть некоторые странности с OpenSSL и многопоточностью. Какой MPM вы используете? Если это связано с многопоточностью, то «предварительная вилка» должна быть безопасной, в то время как «worker» и «event» могут быть затронуты.

Если ваш профиль нагрузки позволяет это, возможно, вы можете попробовать переключиться на prefork и посмотреть, сохраняется ли проблема.

Сначала убедитесь, что хром обновлен. В более старых версиях возникают проблемы с некоторыми шифрами. У меня была эта проблема с хромом на общих сайтах, таких как Amazon и т. Д.

Во-вторых, совет запретить протоколы в «списке шифров», которому вы следовали, является очень плохой идеей, потому что он не запрещает протоколы, он запрещает большинство шифров, включая те, которые работают «начиная с» SSLv3 (но не означает, что вы включаете SSL3, если вы разрешаете шифрование SSLv3), используйте более общий список, предоставленный генератором конфигурации SSL Mozilla для совместимости (обратите внимание, что SSLv2 больше не существует или поддерживается в httpd или openssl, поэтому нет причин запрещать его явно) и, возможно, ваша предыдущая комбинация была слишком строгой , Попробуй это:

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

Если у вас все еще есть проблемы, включите отладку для SSL и посмотрите, что должен сказать httpd (отправьте только одну или две попытки и отключите это ведение журнала, это слишком шумно):

LogLevel ssl:trace3

Примечания: вы также можете удалить SSLCertificateChainFile, поскольку эта директива устарела в версии 2.4. Вы можете добавить цепочку SSLCertificateFile и отсортировать все сертификаты от листа к корневому или даже изменить SSLCertificateChainFile на SSLCACertificateFile (хотя этот в основном используется для аутентификации SSL).

Вы также должны добавить (если еще не сделали), чтобы добавить:

SSLRandomSeed startup file:/dev/urandom 2048
SSLRandomSeed connect file:/dev/urandom 2048
SSLSessionCache shmcb:/path/to/log/ssl_gcache_data(512000)

Изменить: после нашего разговора давайте прибегнем к проверке установки openssl и / или если это действительно та же версия, которую использует ваш httpd:

Выполните эту команду и посмотрим, что в ней написано: openssl ciphers -v 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'

Также, чтобы убедиться, что версия openssl правильная, запустите следующее:

openssl version