Как правильно подобрать шифры для конфига NGINX

Я новичок в nginx и совсем недавно решил внести изменения в файл конфигурации, чтобы перенаправить мои приложения с http на https с помощью оператора return return 301 https://$host$request_uri;. Все это работало нормально, пока я не заметил, что мы не получаем текстовые сообщения через Twilio API. Я решил отладить проблему и обнаружил, что получаю ошибку SSL/TLS Handshake Error.

Заглянув в отладчик, я увидел, что они назвали это возможной причиной проблемы:

Incompatible cipher suites in use by the client and the server. This would require the client to use (or enable) a cipher suite that is supported by the server.

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

server {
        listen      443 ssl http2 default_server;
        listen      [::]:443 ssl http2 default_server;
        server_name     localhost;

        ssl_certificate "/etc/nginx/ssl/domain-crt.txt";
        ssl_certificate_key "/etc/nginx/ssl/domain-key.txt";
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

        ## More configuration below this...
    }

Twilio содержит список поддерживаемых шифров, который можно найти здесь, но я не знаю, как это сделать в моем конфигурационном файле. Должен ли я использовать их все, поскольку мои протоколы включают TLSv1, TLSv1.1, and TLS1.2? Или я использую только один из тех, что в списке. Я действительно смущен тем, что мне нужно установить в моей переменной ssl_ciphers.

Также я читал, что включение SSLv3 в ssl_protocols - плохая идея. Могу ли я просто удалить это из ssl_protocols и сохранить конфигурацию, не вызывая серьезных проблем?

Если бы кто-нибудь мог помочь мне ответить на эти вопросы, это было бы очень полезно. Спасибо!


person Michael    schedule 11.06.2020    source источник


Ответы (1)


Шифры используются по умолчанию, и Nginx настраивает их по версии.

В версии 1.0.5 и выше используются шифры SSL по умолчанию HIGH:!aNULL:!MD5. В версиях 0.7.65 и 0.8.20 и более поздних версиях шифры SSL по умолчанию — HIGH:!ADH:!MD5. Начиная с версии 0.8.19 шифры SSL по умолчанию: ВСЕ:!ADH:RC4+RSA:+HIGH:+MEDIUM. Начиная с версии 0.7.64, 0.8.18 и более ранних шифров SSL по умолчанию: ВСЕ:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP. Дополнительную информацию см. в документах Nginx.

Но вы также можете быть явным и выбрать шифр, который вы хотите использовать: ssl_ciphers cipher1 cipher2 ... cipherN; Например — ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256; для поддержки только этого конкретного набора шифров. Касательно:

Также я читал, что включение SSLv3 в ssl_protocols - плохая идея. Могу ли я просто удалить это из ssl_protocols и сохранить конфигурацию, не вызывая серьезных проблем?

Единственная серьезная проблема, которую это может вызвать, заключается в том, что клиент, использующий SSLv3, пытающийся подключиться к вашему серверу, будет отклонен, поскольку это неприемлемо для вашего сервера (не поддерживается файлом конфигурации). В любом случае, в некоторых версиях это Nginx по умолчанию, и это не должно быть проблемой.

Из документов Nginx:

Начиная с версий 0.7.65 и 0.8.19 и более поздних, протоколами SSL по умолчанию являются SSLv3, TLSv1, TLSv1.1 и TLSv1.2 (если поддерживается библиотекой OpenSSL).

person BarT    schedule 30.06.2020
comment
Это хороший совет спасибо. Тогда я просто выберу один из шифров, перечисленных на их сайте? Или мне нужно выбрать по одному для каждого из протоколов SSL? - person Michael; 30.06.2020
comment
Вы можете выбрать один, но тогда вы позволите клиенту использовать только этот, любой другой шифр будет неприемлем. Я думаю, что вы должны использовать различные шифры, поэтому что-то вроде HIGH:!aNULL:!MD5 будет работать. - person BarT; 30.06.2020
comment
ВЫСОКИЙ означает, что вы рукопожатие с клиентом по самому высокому шифру, приемлемому для обеих сторон (сервера и клиента). !aNULL означает, что вы не принимаете нулевой шифр аутентификации, и это имеет смысл, а MD5 — это еще один алгоритм дайджеста сообщения. - person BarT; 30.06.2020
comment
Могу ли я комбинировать их с другими шифрами? Итак, если бы я сделал что-то вроде: HIGH:!aNULL:!MD5:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA. Или я не могу включать несколько шифров таким образом? Извините за все вопросы, я просто хочу убедиться, что я делаю это правильно. - person Michael; 30.06.2020
comment
Да, вы можете это сделать, просто нужно убедиться, что каждый шифр действителен. - person BarT; 30.06.2020
comment
Проверьте, видите ли вы их в параметрах шифрования openssl. команда: openssl ciphers -V - person BarT; 30.06.2020