我想在服务器上设置 Magento 平台。我使用 Centos 和 nginx,并希望将所有 http 连接重定向到 https。我已经在 nginx domain.conf 上设置了 http https 重定向,这很好用,但我如何确保所有连接都是安全的。我之所以问这个问题,是因为如果我也使用 HSTS,第一个请求可能仍然是 http。
审查我的 example.org.conf 文件
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.org www.example.org;
return 301 https://$server_name$request_uri;
}
server {
#listen 80 reuseport;
#listen 443 http2 ssl reuseport;
listen 443 ssl;
#listen 80;
...
...
}
那么我如何才能确保所有连接都是安全的?我问的第二个原因是,我注意到,如果我使用移动数据速度较慢的智能手机打开域名,它会在一秒钟内启动不安全的 URL,还是我错了?
希望你能给我建议
答案1
如果没有 HSTS,您就无法阻止客户端发起的第一个连接使用 HTTP 而不是 HTTPS,因为您无法控制用户请求的协议。重定向仅在第一个请求后生效。
有了 HSTS,情况就变得更加复杂了:
- 如果您在浏览器的 HSTS 预加载列表中(您肯定不在),它应该始终且仅使用 HTTPS 连接到您的域。
- 如果不是,浏览器与你的域名建立的第一个连接仍然可以是 HTTP,但在重定向后发送的第一个 HTTPS 响应中,你可以设置 HSTS 标头,此后,客户端应该对于当前和未来的会话,仅在标头中指定的持续时间内使用 HTTPS。
- 如果在第一次连接之前有攻击者冒充 MITM,HSTS 无法保护您,因为他可以过滤掉标头。如果攻击发生在设置 HSTS 标头之后,那么这样做会困难得多。
答案2
如何确保所有连接都是安全的
答:您正在永久转发所有 301 https 连接,因此您的服务器不可能接受不安全的连接。
您可以分析 Nginx 访问日志来了解有多少请求从 HTTP 重定向到 https 。
在您的配置中,有些内容需要修改为 Nginx 最佳实践。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.org www.example.org;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.org www.example.org;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}