nginx ssl和hsts设置

时间:2018-04-13 07:38:02

标签: ssl nginx settings hsts

我想将http重定向到https并使用hsts

https://hstspreload.org/
(测试失败)错误:没有HSTS标头 响应错误:响应中没有HSTS标头。

同时我如何重定向并设置设置?

P.S我已经使用aws ssl证书和elb建立负载平衡。

/etc/nginx/conf.d/default.conf

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name My_domain;

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ /index.html;
}

location /api/ {
    proxy_pass              http://localhost:8080;
}

server {
    listen 443 ssl;
    server_name My_domain;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

2 个答案:

答案 0 :(得分:2)

您尚未获得有关您的设置的足够信息,但我可以猜测发生了什么。

我猜你会在你的ELB上卸载你的SSL并将明文HTTP消息发送到Nginx,并将HTTP_X_FORWARDED_PROTO标头设置为原始方案。

因此,如果用户转到https://www.example.com,则会卸载SSL / TLS并将流量定向到http://www.example.com,并将HTTP_X_FORWARDED_PROTO设置为" https"。在这种情况下,没有重定向(因为用户已经在使用HTTPS),但也没有HSTS标头(因为用户没有使用HTTPS到nginx,并且您只在443服务器配置中设置了该标头)。您应该将此添加到端口80服务器,以便为此方案提供HSTS标头:

if ($http_x_forwarded_proto = "https") {
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

从技术上讲,您不应该通过HTTP提供HSTS标头,而只能通过HTTPS提供服务,因此最好在负载平衡级别设置,但我认为使用$http_x_forwarded_proto标头可以这样做。

但是,如果我的猜测是正确的,那么这证明你没有正确使用HSTS,所以我不会在这里添加一些警告。

HSTS并非没有风险。

HSTS是一个很好的事情,可以解决这样一个事实:目前,默认情况下,网络不是HTTPS,这会带来各种安全风险。但是,如果您仍然需要使用HTTP,它并非没有风险。例如,如果您有一些子域尚未转换为HTTPS(例如blog.example.com),或者您对尚未转换的内部站点使用相同的域(例如intranet.example.com)或开发站点( dev.example.com)。最后一个也可能是一个问题,因为HSTS不允许您跳过HTTPS错误(例如,如果您的开发域使用自签名证书)。这并不是说你不应该使用HSTS - 但是你应该充分理解它并在你使自己(和你的组织)痛苦之前进行测试。

出于这个原因,建议从一个小的最大年龄开始,而不是去全年(最大年龄= 31536000)并建立起来。而不是与全额和破坏的东西。这样,如果您发现需要转换的网站,您就不会将其锁定一年或转换为HTTPS。

对于预加载尤其如此,您可以将标题烘焙到浏览器代码库中,以便在您访问网站之前从头开始。您基本上无法撤消此操作(Chrome将至少需要3个月才能删除它,而其他浏览器则没有时间线)。因此,由于它基本上是不可逆转的,所以在你完全测试它之前,你永远不应该进行预加载,看起来你没有。 Chrome has an issue tracking all the screw ups that sites have done where they have requested preload and then broken things。我blog about this dangerhave others。此外,预加载还有一些其他要求(您必须在标头中添加preload属性,并且必须在您的基本域(https://example.com)上提供此标头,而您似乎并未满足。< / p>

基本域问题尤其可能会导致问题,例如,如果您从未正常访问过,那么https://www.example.com的测试看起来很好,http://intranet.example.com仍然有效(因为您从未设置过HSTS)在基本域的标题,以便它可以继续通过HTTP发送)然后你预​​加载和繁荣 - http://intranet.example.com停止工作。测试此方法的最简单方法是将此基本域中的资源添加到您的www网站(例如https://example.com/pixel.png),这将强制为您网站上的任何人提供基础域的HSTS标头。

HSTS很棒。每个站点都应该使用它,每个站点都应该只使用HTTPS - 但在他们这样做之前并非没有风险。确保在部署时了解它。慢慢来,建立一个大的最大年龄。然后才去预加载。

答案 1 :(得分:0)

要成功通过https://hstspreload.org/上的测试,请不要忘记在标头配置中添加preload指令:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

这不是规范的一部分,但Google建议include it in the response