将 HSTS 添加到 nginx 配置

Has*_*aig 8 nginx https hsts

我最近更改了我的 nginx 配置,将所有 http 流量重定向到 https(并将所有 www 流量重定向到 no-www)。

也添加add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;到我的服务器块是否有意义?或者这是不需要的,因为我已经重定向了所有流量?知道优点(和缺点,如果有的话)会很棒。


如果相关,我当前的虚拟主机配置是:

server {
    server_name example.com www.example.com;

    listen 80;

    return 301 https://example.com$request_uri;
}

server {
    server_name www.example.com;

    listen 443 ssl;

    ssl_certificate /etc/nginx/ssl/cert_chain.crt;
    ... other SSL related config ...

    return 301 https://example.com$request_uri;
}

server {
    server_name example.com;

    listen 443 ssl;
    ... other SSL related config ...

    ... remaining server configuration ...
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 16

HSTS 告诉浏览器总是使用 https,而不是 http。添加该配置可能会减少从 http 到 https 的转发需求,因此它可能会略微提高网站性能并非常轻微地降低服务器负载。

作为参考,这是我在基于 Nginx 的网站上使用的安全标头。我将它保存到一个文件中,并从需要它的所有服务器(包括 http 和 https 服务器)中包含它。它允许加载一些常见的资源,如 Google 和 Facebook。

# Security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self' www.google-analytics.com ajax.googleapis.com www.google.com google.com gstatic.com www.gstatic.com connect.facebook.net facebook.com;";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "origin";
Run Code Online (Sandbox Code Playgroud)

澄清

您仍然需要适当的 http 到 https 重定向。

  • 最佳实践是同时使用重定向和 HSTS。重定向可确保您网站的首次访问者被转发到 TLS 连接。HSTS 确保浏览器甚至不会尝试通过 HTTP 进行连接,这使事情更加安全。您应该将 Tim 的指令添加到 TLS 连接(端口 443)的 `server` 块中。 (2认同)

小智 9

接受的答案很好,但已经过时了,并且有一个我在逐行研究时发现的缺陷。

HSTS 标头的持续时间必须至少为三个月才能满足安全要求。我在安全标头片段中使用了以下内容,在 SSL 测试中获得了 A+:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
Run Code Online (Sandbox Code Playgroud)

其次,不推荐使用X-Frame-Options(并且许多/大多数主要浏览器从未支持)。当前的标准(即在所有主要现代浏览器中实现)是Content-Security-Policy(CSP)。

add_header Content-Security-Policy 'frame-ancestors https://mywebapp.mywebsite.example';
Run Code Online (Sandbox Code Playgroud)

从示例中可以明显看出,CSP 标头必须在每个站点的基础上设置(除非我还没有见过聪明的正则表达式/等)。


小智 5

我建议指定always参数add_header以包含内部生成的错误页面的标头。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Run Code Online (Sandbox Code Playgroud)

另外,将该preload指令添加到响应标头,以便您稍后可以将您的网站添加到预加载列表中