如何在使用 nginx 的特定子域上允许 http?(HSTS)

如何在使用 nginx 的特定子域上允许 http?(HSTS)

我正在尝试在上线之前在临时网站上测试我的网站。显然它没有相同的证书。当我尝试使用 testing.domain.com 子域进入时,我在 Firefox 中收到此错误:

SSL_ERROR_BAD_CERT_DOMAIN

testing.website.com has a security policy called HTTP Strict Transport Security (HSTS), which means that Firefox can only connect to it securely. You can’t add an exception to visit this site.
upstream website {
    server 127.0.0.1:3000;
}

#prevent www
server {
  server_name www.website.com;
  return 301 $scheme://website.com$request_uri; 
}

#redirect http to https
server {
    listen 80;
    listen [::]:80;
    server_name website.com;

    return 301 https://$host$request_uri;
}

#https
server
{
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name website.com;

    include /etc/nginx/config/sites/headers.conf;

    include /etc/nginx/config/ssl/resolver.conf;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/website.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/website.com/privkey.pem;

    include /etc/nginx/config/ssl/ssl.conf;

    location /
    {
        proxy_pass http://website;

        include /etc/nginx/config/proxy/proxy.conf;
    }

    #include /etc/nginx/config/cache/static.conf;
}

我添加了这个服务器块,希望它能够处理来自测试子域的 HTTP 请求:

#allow http through testing subdomain
server {
    listen 80;
    listen [::]:80;
    server_name testing.website.com;

    location /
    {
        proxy_pass http://website;
        include /etc/nginx/config/proxy/proxy.conf; 
    }
}

我发现在 headers.conf 下有一行

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

所以我删除了该includeSubDomains部分,希望它能够禁用 HSTS。

即使进行了这些更改,它仍然会立即重定向至http://testing.website.comhttps://testing.website.com然后给我 HSTS 错误。

每次我做出更改时,我都会执行此操作nginx -s reload或重新启动整个服务器,但都没有什么区别。

答案1

这里有 2 个与 HSTS 相关的问题,可能有 3 个。

首先,您选择了includeSubDomains,这意味着您的 NGINX 已告诉浏览器 example.com 的每个子域(包括根域)仅使用 HTTPS。此外,它还告诉浏览器将此值缓存 63072000 秒,也就是 730 天,确切地说是 2 年。这意味着,任何访问过 example.com 任何页面的浏览器如果在地址中看到 example.com,就会强制重定向到 HTTPS。

解决此问题的唯一方法是删除IncludeSubDomains,并使用新安装的浏览器,或者将证书部署到 testing.example.com。即使使用自签名证书也可能有效,我个人从未尝试过。

不过,这里可能还有一个更大的问题。您的配置还声明了选项preload,表明该页面已准备好添加到 HSTS 预加载列表中。HSTS 预加载列表是使用 HSTS 的站点列表,该列表已硬编码到浏览器中。这意味着即使使用新安装的浏览器,也无法绕过 HSTS,因为浏览器事先知道哪些站点使用 HSTS。您需要手动将站点提交到此列表,因此您的域名不太可能在该列表中,但如果您没有设置此特定站点,您永远不知道有人在您之前做了什么。在这种情况下,解决这个问题的唯一方法就是在 example.com 的每个子域上启用 HSTS。

相关内容