Nginx 转发提供错误的证书

Nginx 转发提供错误的证书

我对 nginx 有点小问题。我们有两个子域名,我们称它们为 domain1.com 和 domain2.com。对于 domain2,我们没有进一步的子域名,对于 domain1,我们有几个子域名。如果有人输入www.domain2.com我希望 nginx 将该人转发到https://domain2.com,否则就直接转发到 https:// 。我使用 sites-available 中 domain2 配置末尾的这两个块来实现这一点:

server {
       listen 80;
       server_name domain2.com;
       return 301 https://$http_host$request_uri;
}
server {
       listen 80;
       server_name www.domain2.com;
       return 301 https://domain2.com$request_uri;
}

此外,我还为所有子域名启用了 HSTSadd_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;

现在导航到www.domain2.com,浏览器会抛出错误,因为 nginx 向它们提供了 a_subdomain.domain1.com 的证书。直接访问 domain2.com 时不会发生这种情况,因为 nginx 会提供正确的证书。不幸的是,反向代理 domain1 的子域是不可能的,nginx 似乎在与 PHP 结合时遇到了麻烦。

我怎样才能让 nginx 正确执行此操作?

有趣的是,我也有一个从我们曾经托管的域(不同于域 1 和域 2)到其他服务器上的新域的配置转发,这些转发没有这个问题,但新页面可能不使用 HSTS,所以这可能是原因。

答案1

HSTS 政策导致内部重定向在浏览器中从 HTTP 转换为 HTTPS;浏览器永远不会看到 Nginx 中配置的重定向。从浏览器中的开发人员工具(网络选项卡):

请求 URL: http://www.isdm.rwth-aachen.de/
 请求方法: 得到
状态代码: 307 内部重定向
推荐人政策: 跨域时严格来源

https://www.isdm.rwth-aachen.de/使用来自 HTTPS默认块的证书的答案server{}

$ curl "https://www.isdm.rwth-aachen.de/" -v

* Server certificate:
*  subject: C=DE; ST=Nordrhein-Westfalen; O=RWTH Aachen University; CN=carl.fsmuw.rwth-aachen.de
*  start date: Apr 13 00:00:00 2023 GMT
*  expire date: Apr 12 23:59:59 2024 GMT
*  subjectAltName does not match www.isdm.rwth-aachen.de
* SSL: no alternative certificate subject name matches target host name 'www.isdm.rwth-aachen.de'

为了与 HSTS 导致的这种行为相匹配,您应该将 Nginx 配置为首先重定向到 HTTPS,然后才在子域和顶点之间重定向。所有正在使用的 HTTPS 子域都应具有有效的证书,这不应该成为交易破坏者Let's Encrypt 时代

  1. 作为默认(第一个)服务器,这已经涵盖了第一阶段:

    server {
        listen 80;
        server_name isdm.rwth-aachen.de;
        return 301 https://$http_host$request_uri;
    }
    
  2. 您可以改变第二个server{}块来执行第二阶段,并获得主机名的有效证书。

    server {
        listen 443 ssl;
        server_name www.isdm.rwth-aachen.de;
        ssl_certificate /etc/letsencrypt/live/www.isdm.rwth-aachen.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.isdm.rwth-aachen.de/privkey.pem;
        return 301 https://isdm.rwth-aachen.de$request_uri;
    }
    

答案2

这主要是评论 - 但有点长......

如果有人进入www.domain2.com我希望 nginx 将该人转发到https://domain2.com

好吧,这开始有点愚蠢;你只能在 domain2.com 上拥有单个 A 记录,但你可以在www.domain2.com

服务器名称是dm.rwth-aachen.de;

我以为我们在谈论 [www.]domain[1,2].com

浏览器抛出错误,因为 nginx 向它们提供了 a_subdomain.domain1.com 的证书

但是您只向我们展示了您的配置的一部分,不包括 https 上的任何内容,也没有您的证书的详细信息。

相关内容