ssl - nginx - 使用 ssl-support 设置多个 server_name

标签 ssl nginx ssl-certificate vhosts

我喜欢使用 nginx 为具有多个域名和 SSL 的网站提供服务:

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

两者都使用相同的虚拟主机,所以我只设置了 server_name 两次。 问题是,我需要 nginx 为每个域名提供正确的 ssl 证书。

使用一个虚拟主机是否可行,还是我需要设置两个虚拟主机?

最佳答案

2014 年 11 月编辑:初始答案不正确且不完整;它需要刷新!在这里。

基本上有两种情况

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

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

    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 让客户端(浏览器)在请求 header 中发送它想要访问的主机,从而允许服务器(nginx)在必须处理证书之前处理 vhosts。配置同上,只是每个vhost有一个特定的证书,crtkey

( nginx support SNI from 0.9.8f, check your nginx server is SNI compliant )
( also, SF talks about SNI and browser support )

否则,如果您也想访问旧版浏览器,则需要多个 vhosts 分别监听一个不同 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;
      ...
    }

理由很好explained here .

关于ssl - nginx - 使用 ssl-support 设置多个 server_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14434120/

相关文章:

Java okhttp 重定向计数和域证书中的问题

rest - postman "Self-signed SSL certificates are being blocked"

asp.net - Chrome ERR_HTTP2_PROTOCOL_ERROR + Firefox 安全连接失败

ssl - 强制 haproxy 到 https

带有 spa 和子目录根的 nginx 配置

nginx - iptables 或 nginx 拒绝 ip 阻塞?

R:在 Rcurl getURL 语句中指定 SSL 版本

Java8 安全 WebSocket 握手问题(Tyrus 和 Jetty)

django - Nginx 没有重定向到 Django

ssl - 为移动应用程序进行 HTTPS 调用录制 JMeter 脚本