Прошло много времени с тех пор, как мне понадобился ServerFault, надеюсь, кто-нибудь может мне помочь. Я пытаюсь защитить свое приложение Laravel (PHP), работающее в Amazon Linux, с помощью бесплатного SSL LetsEncrypt.
С помощью certbot-auto
, Я успешно создал такие сертификаты SSL:
./certbot-auto --debug -v --server https://acme-v01.api.letsencrypt.org/directory certonly -d example.com -d www.example.com
Я также создал dhparam
используя эту команду:
openssl dhparam -dsaparam -out /etc/nginx/dhparam.pem 4096;
Это мое /etc/nginx/nginx.conf
конфигурация:
user www-data;
worker_processes 1;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;
events
{
worker_connections 1024;
use epoll;
multi_accept on;
}
http
{
# SSL Security
ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
// ... other settings omitted out
# Load vHosts
include /etc/nginx/conf.d/*.conf;
}
P.S. Я получил конфигурацию безопасности nginx от https://cipherli.st
а это мой сервер (виртуальный хост) /etc/nginx/conf.d/example.com.conf
config:
## Nginx php-fpm upstream
upstream php73-fpm {
server localhost:9001 max_fails=3 fail_timeout=30;
server localhost:9002 max_fails=3 fail_timeout=30;
}
## Redirect insecure traffic to secure site
server {
listen 80;
server_name example.com www.example.com;
return 302 https://www.example.com$request_uri;
}
## Web Server Config
server
{
## Server info
listen 443 default_server ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server_name example.com www.example.com;
root /home/www-data/example/src/public;
index index.html index.php;
## DocumentRoot setup
location / {
try_files $uri $uri/ /index.php?$query_string;
expires 30d;
}
## Disable .htaccess and other hidden files
location /. {
return 404;
}
## Execute php scripts
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass php73-fpm;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.(?:php))(/.*)$;
fastcgi_intercept_errors on;
include fastcgi_params;
try_files $uri = 404;
expires off;
}
}
После настройки я перезапустил свой nginx
и php-fpm
и когда я посетил свой сайт, он не загрузился в Chrome с этой ошибкой:
This site can’t be reached
The connection was reset.
Я проверил, запущен ли nginx, и он выглядит так:
[root@server nginx]# service nginx status
nginx (pid 11781) is running...
[root@server nginx]# netstat -tlpn | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11781/nginx
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 11781/nginx
Я не вижу явных ошибок в /var/log/nginx
либо. Любые идеи?
Хорошо, я сам решил проблему.
Похоже, установка протокола TLS только на v1.3 не работает, хотя моя версия nginx определенно > 1.13.0
.
Покопавшись, я выяснил, почему TLS v1.3 не работает в Amazon Linux. Это потому, что для этого требуется версия OpenSSL: 1.1.1
и Amazon Linux имеет OpenSSL 1.0.2k-fips 26 Jan 2017
(на момент написания этого ответа).
Кроме того, поскольку у меня есть ssl_stapling
включен, я забыл указать действующий файл сертификата в моем domain.com.conf.
После внесения необходимых изменений; Я тестировал это на https://www.ssllabs.com/ssltest и я получил А + забить, так что пока достаточно.
Вот рабочая конфигурация для меня:
nginx.conf
user www-data;
worker_processes 1;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;
events
{
worker_connections 1024;
use epoll;
multi_accept on;
}
http
{
# SSL Security
ssl_protocols TLSv1.2 TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
// ... other http configs
}
domain.com.conf
## Nginx php-fpm upstream
upstream php73-fpm {
server localhost:9001 max_fails=3 fail_timeout=30;
server localhost:9002 max_fails=3 fail_timeout=30;
}
## Redirect insecure traffic to secure site
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 302 https://www.example.com$request_uri;
}
## Web Server Config
server
{
## Server info
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
server_name example.com www.example.com;
root /home/www-data/example/src/public;
index index.html index.php;
## DocumentRoot setup
location / {
try_files $uri $uri/ /index.php?$query_string;
expires 30d;
}
## Disable .htaccess and other hidden files
location /. {
return 404;
}
## Execute php scripts
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass php73-fpm;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.(?:php))(/.*)$;
fastcgi_intercept_errors on;
include fastcgi_params;
try_files $uri = 404;
expires off;
}
}