Nginx - HSTS и Перенаправление без www на www
Я проверяю заголовок HSTS здесь: https://hstspreload.org/
Это мой не-WWF конф
server {
listen 443
server_name example.com;
return 301 https://www.$server_name$request_uri;
##SSL
add_header Strict-Transport-Security "max-age=xxxx; includeSubDomains; preload" always;
}
server {
listen 80
server_name example.com;
return 301 https://$server_name$request_uri;
}
Я получаю сообщение об ошибке "Ошибка ответа: в ответе отсутствует заголовок HSTS"
Заголовок виден, когда я удаляю перенаправление с сервера 443.
В основном, чтобы HSTS работал, мне нужно перенаправить http://example.com/ на https://example.com/ а затем на https://www.example.com/
1 ответ
HTTP Strict Transport Security (HSTS) может быть реализован двумя различными способами:
1) HSTS путем установки заголовков HSTS
Пример для Nginx:add_header Strict-Transport-Security "max-age=15768000; preload" always;
В первый раз посетители получат этот заголовок, а их браузеры будут внутренне перенаправлены на HTTPS (см. Перенаправление 307 на вкладке вашей сети, если вы просматриваете веб-сайт). Браузеры кэшируют этот HSTS для данного максимального возраста, и повторяющиеся посетители будут использовать HTTPS, если они запросят ваш сайт.
2) HSTS по предварительной нагрузке
Для этого вы можете использовать сервис, предоставляемый сайтом https://hstspreload.org/
Здесь вы можете добавить домен 2-го уровня (например, my-company.com) в список, который браузеры будут использовать для загрузки сайта через HTTPS. Прежде чем вы сможете добавить сайт в этот список, этот сайт должен установить правильные заголовки HSTS.
Кроме того, вы должны рассмотреть следующие детали:
- удаление домена из списка требует времени, и вам лучше этого избежать
- Предварительная загрузка включает все дочерние домены для этого домена второго уровня (например, www.my-company.com, abc.my-company.com, printer.my-company.com).
- HTTP-доступ к поддоменам (например, для локальных служб печати) может больше не работать
- Помимо вышеперечисленных проблем, предварительная загрузка HSTS ускоряет доступ к веб-сайту для новых посетителей и повышает его безопасность.
Что касается перенаправления HTTP на HTTPS-трафик и HSTS, я рекомендую следующую настройку:
Конфигурация виртуального хоста Nginx
# HTTPS server section
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.my-company.com;
# include SSL configuration
include mycompany-ssl.conf;
# web root path
root /var/www/www.my-company.com/htdocs;
# allow access to .well-known (PKI validation folder)
location ~ ^/\.well-known {
allow all;
}
...
}
# redirect HTTPS and non-www requests
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name my-company.com;
# include SSL configuration
include mycompany-ssl.conf;
# web root path
root /var/www/www.my-company.com/htdocs;
# allow access to .well-known (PKI validation folder)
location ~ ^/\.well-known {
allow all;
}
# default redirect
location / {
return 301 https://www.$http_host$request_uri;
}
}
# redirect HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name my-company.com www.my-company.com;
# web root path
root /var/www/www.my-company.com/htdocs;
# allow access to .well-known (PKI validation folder)
location ~ ^/\.well-known {
allow all;
}
# default redirect
location / {
return 301 https://$http_host$request_uri;
}
}
Nginx включает конфигурацию для SSL/TLS
ssl on;
ssl_protocols TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:EECDH:EDH:!MD5:!RC4:!LOW:!MEDIUM:!CAMELLIA:!ECDSA:!DES:!DSS:!3DES:!NULL";
ssl_prefer_server_ciphers on;
# Create session ticket key: openssl rand -out /etc/nginx/ssl/session_ticket_key 48
ssl_session_ticket_key /etc/nginx/ssl/session_ticket_key;
# Create dhparam4096.pem: openssl dhparam -out /etc/nginx/ssl/dhparam4096.pem 4096
ssl_dhparam /etc/nginx/ssl/dhparam4096.pem;
ssl_ecdh_curve secp384r1;
# Enable SSL stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=1800s;
resolver_timeout 15s;
# set security headers (see http://securityheaders.io/ for more details)
add_header Strict-Transport-Security "max-age=15768000; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin" always;
# set certificate files
ssl_certificate /etc/letsencrypt/www.my-company.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/www.my-company.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/www.my-company.com/fullchain.pem;