Não tenho certeza se é bom responder a essa pergunta provavelmente "morta e enterrada", mas aqui vamos nós ...
Configuração básica (ou seja, meh security )
- Gere sua chave privada (> = 2048 bits) e seu certificado. Eu suponho que você já os tenha, caso contrário dê uma olhada em letsencrypt.org . Certifique-se de que seu certificado inclua a cadeia completa de certificados (geralmente certificados intermediário / entidade ). Quanto aos parâmetros Diffie-Hellman, você pode gerá-los executando
openssl dhparam -out /path/to/dhparam.pem 2048
. -
Defina as configurações de SSL de acordo com o gerador de configurações SSL do Mozilla ( intermediário configurações, a partir de 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; } }
Configuração avançada (ou seja, vem para mim, NSA! (bem, não, mas ...) )
Pegue a configuração básica acima e ajuste-a da seguinte forma:
- Selecione (pelo menos) 3072bit quando você gerar seu certificado e seus parâmetros Diffie-Hellman (sim, vai demorar um pouco, mas vale a pena).
- Use apenas o TLS1.2:
ssl_protocols TLSv1.2;
- Use uma curva segura:
ssl_ecdh_curve secp384r1;
- Use suítes de criptografia "modernas" (a partir de 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';
-
Aplicar HTTPS para todos:
-
Reescreva seu bloco "HTTP"
server
da seguinte forma:server { listen 80; listen [::]:80; server_name mySuperServer; return 301 https://$server_name$request_uri; }
-
Use um cabeçalho HSTS para forçar o navegador do visitante a usar o HTTPS exclusivamente:
add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';
-
-
O seu servidor também pode proteger o seu site (em certa medida), configurando esses cabeçalhos:
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';
- Práticas recomendadas gerais aqui: nunca use
root
para modificar seus arquivos. Usesudo
em vez disso.
Bônus
- Se o seu servidor estiver executando o nginx > 1.9.5, você pode usar HTTP / 2 por
adicionando
http2
na sua diretivalisten
. - Seu servidor tem um endereço IPv6 (e suporta HTTP / 2)? Boa ! Adicione
listen [::]:443 ssl http2;
abaixo da primeira diretivalisten
. - Você planeja usar seu servidor para vários domínios? Você deve definir
access_log
eerror_log
para cada blocoserver
. - A cópia / colagem raramente é excitante ... Você pode mover o bloco
### SSL/TLS SETTINGS ###
em um arquivo de texto e incluí-lo em sua configuração. O mesmo para sua chamada CGI para PHP. - Você pode acelerar um pouco as comunicações entre o nginx e seu interpretador PHP usando um soquete UNIX em vez de ouvir sua interface de loopback:
fastcgi_pass unix:/var/run/php5-fpm.sock;
.
Como resultado, seu bloco server
deve ser parecido com isto:
#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;
}
Conteúdo de 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';
Conteúdo de 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;
}