我想将http重定向到https并使用hsts
https://hstspreload.org/(测试失败)错误:没有HSTS标头
响应错误:响应中不存在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;
}
最佳答案
您尚未提供足够的设置信息,但我可以猜测发生了什么。
我猜你是在ELB上卸载SSL,并将HTTP_X_FORWARDED_PROTO
标头设置为原始方案的纯文本HTTP消息发送到Nginx。
因此,如果用户转到https://www.example.com,则它会卸载SSL / TLS,并将HTTP_X_FORWARDED_PROTO
设置为“ https”的流量定向到http://www.example.com。在这种情况下,没有重定向(因为用户已经在使用HTTPS),也没有HSTS标头(因为用户没有在nginx上使用HTTPS,而您仅在443服务器配置中设置了该标头)。您应该将此添加到端口80服务器,以在这种情况下还提供HSTS标头:
if ($http_x_forwarded_proto = "https") {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
从技术上讲,您不应通过HTTP而是仅通过HTTPS来提供HSTS标头,因此最好在负载平衡级别进行设置,但是我认为使用
$http_x_forwarded_proto
标头可以。但是,如果我的猜测是正确的,那么这证明您没有正确使用HSTS,因此如果不在此处添加一些警告,将是我的错。
HSTS并非没有风险。
HSTS可以很好地解决以下事实:当前,默认情况下,Web不是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 danger,作为have others。另外,预加载还具有一些其他要求(您必须将
preload
属性添加到标头中,并且还必须在基本域(https://example.com)上提供此标头),但是看起来似乎没有满足。如果,例如,您从来没有正常访问过基本域问题,则可能会特别引起问题,因此https://www.example.com的测试看起来很好并且http://intranet.example.com仍然有效(因为您从未在基本域中设置HSTS标头,因此它可以继续(通过HTTP发送),然后您进行预加载和繁荣-http://intranet.example.com停止工作。最简单的测试方法是将基本域中的资源添加到您的www站点(例如https://example.com/pixel.png),这将强制所有访问您网站的人使用基本域的HSTS标头。
HSTS很棒。每个站点都应该使用它,每个站点都应该仅使用HTTPS-但是,直到这样做,这并非没有风险。确保在部署它时了解它。慢慢来,并建立一个大的最大寿命。然后才进行预加载。