【问题标题】:nginx - set multiple server_name with ssl-supportnginx - 使用 ssl 支持设置多个 server_name
【发布时间】:2013-01-04 05:47:00
【问题描述】:

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

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

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

这可以通过一个虚拟主机实现还是我需要设置两个虚拟主机?

【问题讨论】:

    标签: ssl nginx ssl-certificate vhosts


    【解决方案1】:

    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都有一个特定的证书,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

    【讨论】:

    • 舒尔,这是一个解决方案,但不是一个好的解决方案。改变一个虚拟主机意味着改变另一个。而且至少会有 4 个虚拟主机...
    • 注意:第二个选项 - 在 if 中包含 ssl_certificate 不起作用。
    • 根据我的阅读,HTTP_HOST 位于请求标头中,并且标头由 SSL 加密。因此,在使用正确的 SSL 证书解密之前,您无法检查 HTTP_HOST。 22.
    • 答案完全重写。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2016-02-02
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多