【问题标题】:Nginx TLS-SNI: Use hostname dependent SSL for HTTPSNginx TLS-SNI:对 HTTPS 使用依赖于主机名的 SSL
【发布时间】:2018-10-30 06:35:06
【问题描述】:

我需要使用两个不同的 ssl 证书,同时 nginx 指向同一个应用程序。

https://domain1.com 指向 1.1.1.1
https://domain2.com 指向 1.1.1.1 .
.
.
.
https://domainN.com 指向 1.1.1.1

尝试了以下方法:

server {
listen 80;
server_name domain1.com;
return 301 https://$host$request_uri;
}



server {

    listen 443 ssl;
    server_name domain1.com;
    root /app/dist;

    index index.html;

    ssl_certificate /etc/nginx/ssl/d1/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/d1/private.key;

    location / {

        try_files $uri $uri/ /index.html;

    }

}

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



server {

    listen 443 ssl;
    server_name domain2.com;
    root /app/dist;

    index index.html;

    ssl_certificate /etc/nginx/ssl/d2/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/d2/private.key;

    location / {

        try_files $uri $uri/ /index.html;

    }

}

这不起作用,它只是加载第一个证书,导致使用第二个域访问时证书无效。

不能合并域证书。 我不能为 nginx 旋转两个不同的实例,因为情况需要帮助我解决指向相同 IP 的 n 域,最好使用一个 nginx 服务器。

有出路吗?

【问题讨论】:

  • 你的server_name 指令一半是正确的,一半是错误的。 https:// 位不是服务器名称的一部分。请参阅this document 了解更多信息。
  • 感谢指点,我已更正。但在发布之前,我确实使用更正的名称进行了尝试。它只会加载第一个块的 SSL 证书。我认为这是不可能的,因为主机名本身将被加密,并且需要正确的证书来解密它,这将再次需要主机名。所以它是一个永无止境的循环,如场景。可悲的是,有些事情不能用软件来完成。 :(
  • nginx 实现 SNI(请参阅 this link)为请求的主机名提供正确的证书。如果正在使用第一个 server 块 - 这意味着请求的主机名与 server_name 指令的值不匹配。使用nginx -T 测试您的配置。
  • 感谢您的及时回复。这是完全匹配的,我刚刚将端口从 443 ssl 更改为 80 并注释了 ssl 文件行,它可以很好地加载 http 版本。我会仔细检查并回复你。另外,我正在使用让我们加密通配符证书。
  • 非常感谢!!!! TLS SNI 已禁用。有效! :) 软件确实允许您做任何事情。再开心不过了。

标签: nginx


【解决方案1】:

感谢Richard Smith 指出正确的内容!

因此,要设置 nginx 为指向同一个 nginx 的域使用不同的证书密钥对,我们必须依赖 TLS-SNI(服务器名称指示),其中域名作为未加密文本的一部分发送握手。这有助于 nginx 决定将哪个证书密钥对用于传入的安全请求。

可以阅读更多关于 SNI here.

继续配置。

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



server {

    listen 443 ssl;
    server_name domain1.com;
    root /app/dist;
    index index.html;
    ssl_certificate /etc/nginx/ssl/d1/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/d1/private.key;

    location / {    
        try_files $uri $uri/ /index.html;
    }
}


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



server {

    listen 443 ssl;
    server_name domain2.com;
    root /app/dist;
    index index.html;
    ssl_certificate /etc/nginx/ssl/d2/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/d2/private.key;

    location / {    
        try_files $uri $uri/ /index.html;
    }
}

上述配置将域 1 和域 2 的 HTTP (80) 转发到相应的 HTTPS (443) 服务器块,其中加载了相应的证书密钥对。
直接处理 HTTPS (443) 请求。
nginx 通过使用 SNI 选择服务器名称来决定要命中哪个块。

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2021-04-13
    • 2013-08-21
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多