Лучшие настройки HTTPS (TLS) Nginx
Для начала приведу правильную конфигурацию, которую вы можете утащить к себе. И, да, под HTTPS я имею в виду TLS.
Ниже разъяснение значимых моментов.
ssl_certificate /etc/nginx/ssl/domain.net.pem;
Путь к общему сертификату, который должен содержать ваш сертификат, и сертификат авторизационного сервера, пример того, как его собрать:
cat public_domain.net.pem sub.class1.server.ca.pem > domain.net.pem
Корневой сертификат (ca.pem), эта цепочка содержать не должна, так как он в любом случае есть в списке доверенных сертификатов сервера. Советую подумать о самоподписанном сертификате.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Протоколы общения клиента и сервера. SSLv3 небезопасен, на замену ему создан TLSv1, который мы и используем. Отказом от SSLv3 мы теряем поддержку IE6, по данным Cloudfare на май 2014 года это 0.000002% трафика (292 уникальных USER-AGENT). RC4 must die, ваш браузер давно поддерживает более безопасное шифрование.
add_header Strict-Transport-Security max-age=31536000;
Надолго (считайте, навечно), говорим клиенту, что общаться с этим сервером можно только и только по HTTPS.
add_header X-Frame-Options DENY;
Запрещаем показ сайта в frame, iframe, object, защищает от man in the middle атаки (explanation).
ssl_prefer_server_ciphers on;
Предпочитаем выбор метода шифрования сервера, поскольку на нём мы можем выбрать, какие методы использовать предпочтительней (docs, ru_docs).
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
Только безопасные методы шифрования, Forward secrecy где это возможно.
Бонусом полезные в nginx вещи, не относящиеся к ssl.
listen 443 deferred spdy ssl;
listen [::]:443 deferred ssl spdy ipv6only=on;
Слушаем порт 443 IPv4 и IPv6 на всех интерфейсах, deferred ускоряет работу соединений linux-сервера (info), spdy включает использование быстрого протокола SPDY, если клиент поддерживает это (docs, ru_docs, результат внедрения SPDY Яндексом)
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name _; return 301 https://$host$request_uri; }
Здесь приведён правильный способ перенаправить домен с www на домен без www (или наоборот). default_server в listen означает что, если не сработал иной блок, будет использован этот. В данном случае — мы перенаправим пользователя, откуда бы он не пришёл, на https://domain.net
.
Результат теста безопасности сервера с такими настройками.
Результат таких настроек: в Firefox главная страница этого сайта была получена за 180мс.
Huge thanks to Hynek Schlawack.
Автор Dmitry Verkhoturov
Последнее обновление 29 декабря 2023
Markdown Текст в Markdown »
Лицензия CC BY 4.0