Не уверен, что было бы хорошо ответить на этот, вероятно, "мертвый и похороненный" вопрос, но здесь мы идем ...
Базовая конфигурация (т.е. безопасность)
- Создайте свой закрытый ключ (> = 2048bit) и свой сертификат. Я предполагаю, что они у вас уже есть, иначе посмотрите на letsencrypt.org. Убедитесь, что ваш сертификат включает в себя полную цепочку сертификатов (обычно это промежуточные / юридические сертификаты). Что касается параметров Диффи-Хеллмана, вы можете сгенерировать их, запустив
openssl dhparam -out /path/to/dhparam.pem 2048
.
Настройте параметры SSL в соответствии с генератором конфигурации Mozilla SSL (промежуточные настройки по состоянию на 2016-06-30):
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost;
root /var/www/wordpress;
### SSL/TLS SETTINGS ###
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers '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_prefer_server_ciphers on;
### OCSP Stapling ###
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
resolver <IP DNS resolver>;
include /etc/nginx/default.d/*.conf;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Продвинутая конфигурация (т.е. зайди ко мне, АНБ!(ну нет, но ...))
Возьмите базовую конфигурацию выше и настройте ее следующим образом:
- Выберите (как минимум) 3072bit при создании сертификата и параметров Диффи-Хеллмана (да, это займет некоторое время, но оно того стоит).
- Используйте только TLS1.2 :
ssl_protocols TLSv1.2;
- Используйте безопасную кривую:
ssl_ecdh_curve secp384r1;
- Используйте "современные" наборы шифров (по состоянию на 2016-06-30):
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
Обеспечить HTTPS для всех:
Перепишите свой блок HTTP- server
следующим образом:
server {
listen 80;
listen [::]:80;
server_name mySuperServer;
return 301 https://$server_name$request_uri;
}
Используйте заголовок HSTS, чтобы заставить навигатор вашего посетителя использовать исключительно HTTPS: add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';
Ваш сервер также может защитить ваш сайт (в некоторой степени), установив следующие заголовки:
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'none';
- Общая рекомендация: никогда не используйте
root
для изменения ваших файлов. Вместо этого используйте sudo
.
бонус
- Если на вашем сервере запущено nginx> 1.9.5, вы можете использовать HTTP/2, добавив
http2
в директиву listen
.
- Ваш сервер получил адрес IPv6 (и поддерживает HTTP/2)? Хорошо ! Добавить
listen [::]:443 ssl http2;
ниже первой директивы listen
.
- Планируете ли вы использовать свой сервер для нескольких доменов? Затем вы должны установить
access_log
и error_log
для каждого блока server
.
- Копирование /вставка редко вызывает ... Вы можете переместить блок
### SSL/TLS SETTINGS ###
в текстовый файл и включить его в свою конфигурацию. То же самое для вашего вызова CGI в PHP.
- Вы можете немного ускорить обмен данными между nginx и вашим интерпретатором PHP, используя сокет UNIX вместо прослушивания вашего интерфейса обратной связи:
fastcgi_pass unix:/var/run/php5-fpm.sock;
,
В результате ваш блок server
должен выглядеть примерно так:
#HTTP server
server {
listen 80;
listen [::]:80;
server_name mySuperServer;
return 301 https://$server_name$request_uri;
}
# HTTPS server
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2;
server_name mySuperServer;
index index.php index.html index.htm;
root /path/to/your/files/mySuperServer;
access_log /var/log/nginx/mySuperServer/access.log;
error_log /var/log/nginx/mySuperServer/error.log;
### SSL/TLS SETTINGS ###
ssl on;
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/privkey.pem;
ssl_dhparam /path/to/your/dh_parameters.pem;
include securityrules.inc;
include fastcgi.inc;
}
Содержание securityrules.inc
:
ssl_protocols TLSv1.2;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
### HTTP HEADERS ###
add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'none';
Содержание fastcgi.inc
:
location ~ \.php$ {
include fastcgi_params;
fastcgi_keep_conn on;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}