nginx -使用ssl支持设置多个服务器名称

r6hnlfcb  于 2023-01-08  发布在  Nginx
关注(0)|答案(2)|浏览(147)

我很想使用nginx来服务一个网站,多个域名和SSL:

  • webmail.example.com
  • webmail.beispiel.de

两个都使用相同的vhost,所以我只设置了两次server_name。问题是,我需要nginx为每个域名提供正确的ssl证书。
使用一个vhost可以实现这一点吗?还是需要设置两个vhost?

rjee0c15

rjee0c151#

2014年11月**:初始答案不正确且不完整;它需要翻新一下!在这里。
基本上有两种情况

      • 您拥有通配符证书**(或多域证书)

在这种情况下,您可以使用多个 * vhosts * 侦听同一IP地址/https端口,并且两个 * vhosts * 使用同一证书(侦听所有接口),例如

server {
      listen 443;
      server_name webmail.example.com;
      root /var/www/html/docs/sslexampledata;
    
      ssl on;
      ssl_certificate /var/www/ssl/samecertif.crt;
      ssl_certificate_key /var/www/ssl/samecertif.key;
      ...
    }
    
    
    server {
      listen 443;
      server_name webmail.beispiel.de;
      root /var/www/html/docs/sslbeispieldata;
    
      ssl on;
      ssl_certificate /var/www/ssl/samecertif.crt;
      ssl_certificate_key /var/www/ssl/samecertif.key;
      ...
    }

或者在您的特定情况下,让两个域使用相同的数据

server {
      listen 443;
      server_name webmail.example.com webmail.beispiel.de; # <== 2 domains
      root /var/www/html/docs/sslbeispieldata;
    
      ssl on;
      ssl_certificate /var/www/ssl/samecertif.crt;
      ssl_certificate_key /var/www/ssl/samecertif.key;
      ...
    }
      • 您有两个(+)不同的证书**

上述情况(一个IP用于所有证书)仍然可以通过服务器名称指示在现代浏览器上工作。SNI让客户端(浏览器)在请求报头中发送它想要到达的主机,允许服务器(nginx)在必须处理证书之前处理 * vhosts 。配置与上面相同,除了每个 * vhost * 都有一个特定的证书, crt * 和 * key *。
(nginx支持SNI从0.9.8f,检查您的nginx服务器是SNI兼容)
also, SF talks about SNI and browser support
否则,如果您还想访问较旧的浏览器,则需要多个 * vhost * 监听每个 * 不同 * 的IP地址/https端口,例如

server {
      listen 1.2.3.4:443; # <== IP 1.2.3.4
      server_name webmail.example.com;
      root /var/www/html/docs/sslexampledata;
    
      ssl on;
      ssl_certificate /var/www/ssl/certifIP1example.crt;
      ssl_certificate_key /var/www/ssl/certifIP1example.key;
      ...
    }
    
    
    server {
      listen 101.102.103:443; <== different IP
      server_name webmail.beispiel.de;
      root /var/www/html/docs/sslbeispieldata;
    
      ssl on;
      ssl_certificate /var/www/ssl/certifIP2beispiel.crt;
      ssl_certificate_key /var/www/ssl/certifIP2beispiel.key;
      ...
    }

原因很好。

iklwldmw

iklwldmw2#

使用TLS SNI:SNI允许浏览器在SSL握手期间传递请求的服务器名称
检查Nginx是否启用TLS SNI

$ nginx -V
...
TLS SNI support enabled
...

并在error_log中检查此警告是否不存在:
nginx是使用SNI支持构建的,但是,现在它动态链接到一个OpenSSL库,该库没有tlsext支持,因此SNI不可用
Nginx HTTPS documentation具有更多详细信息。
如果启用了TLS SNI,则以下配置工作正常。
x一个一个一个一个x一个一个二个一个x一个一个三个一个
参考:Nginx TLS SNI
如果Nginx禁用TLS SNI:Nginx将对所有请求使用默认的server证书。
Nginx documentation
这是由SSL协议行为引起的。SSL连接是在浏览器发送HTTP请求之前建立的,而nginx不知道所请求服务器的名称。因此,它可能只提供默认服务器的证书。

相关问题