Nginx - HSTS and Redirect non-www to www

I am checking the HSTS header here: https://hstspreload.org/

This is my non-www conf

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;
}

I get the error "Response error: No HSTS header is present on the response"

The header is visible when I remove the redirect from 443 server.

Basically for HSTS to work I neeed to redirect http://example.com to https://example.com and then to https://www.example.com

0
задан 4 July 2018 в 11:36
1 ответ

Строгая транспортная безопасность HTTP (HSTS) может быть реализована двумя разными способами:

1) HSTS путем установки заголовков HSTS

Пример для Nginx: add_header Strict-Transport-Security "max-age = 15768000; предварительная загрузка" всегда;

Первый раз посетители получат этот заголовок, и их браузеры будут выполнять внутреннюю переадресацию на HTTPS (см. «Перенаправление 307» на вкладке «Сеть», если вы проверяете веб-сайт). Браузеры кэшируют этот HSTS для данного максимального возраста, и постоянные посетители будут использовать HTTPS, если они запросят ваш сайт.

2) HSTS от Preload

Для этого вы можете использовать сервис, предоставляемый сайтом https://hstspreload.org/

Здесь вы можете добавить домен 2-го уровня (например, my-company. com) в список основных браузеров, которые будут использовать для загрузки веб-сайта через HTTPS. Прежде чем вы сможете добавить сайт в этот список, этот сайт должен установить правильные заголовки HSTS.

Кроме того, вам следует учесть следующие детали:

  • удаление домена из списка требует некоторого времени, и вам лучше избегать этой предварительной загрузки
  • , включающей все поддомены для этого домена 2-го уровня (например, www.my-company. com, abc.my-company.com, printer.my-company.com)
  • HTTP-доступ к субдоменам (например, для локальных служб печати) может больше не работать
  • помимо перечисленных выше проблем. Предварительная загрузка HSTS ускоряет доступ к

Что касается перенаправления HTTP-трафика на HTTPS и HSTS, я рекомендую следующую настройку:

Nginx Virtual Host Config

# 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 Include Config for 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;
0
ответ дан 5 December 2019 в 05:44

Теги

Похожие вопросы