Для начала приведу правильную конфигурацию, которую вы можете утащить к себе. И, да, под 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 (explanation).

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 .domain.net;
    return 301 https://domain.net;
}

Здесь приведён правильный способ перенаправить домен с www на домен без www (или наоборот). default_server в listen означает что, если не сработал иной блок, будет использован этот. В данном случае — мы перенаправим пользователя, откуда бы он не пришёл, на https://domain.net.

Результат теста безопасности сервера с такими настройками.

Результат таких настроек: в свежую версию Firefox главная страница этого сайта была получена за 180мс:

wireshark https dump

Huge thanks to Hynek Schlawack and Diego Plentz.

Comments