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

时间:2013-01-21 07:28:17

标签: ssl nginx ssl-certificate vhosts

我很乐意使用nginx来提供具有多个域名和SSL的网站:

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

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

这可能是一个虚拟主机还是我需要设置两个虚拟主机?

1 个答案:

答案 0 :(得分:43)

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 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