69

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

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

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

一个虚拟主机可以做到这一点,还是我需要设置两个虚拟主机?

4

1 回答 1

86

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

基本上,有两种情况

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

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

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)在处理证书之前处理虚拟主机。配置与上面相同,只是每个vhost都有一个特定的证书crtkey

nginx 从 0.9.8f 开始支持 SNI,检查你的 nginx 服务器是否符合 SNI
另外,SF 谈到了 SNI 和浏览器支持

否则,如果您还想访问旧版浏览器,则需要多个虚拟主机监听不同的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;
  ...
}

原因在这里解释得很好。

于 2013-01-21T07:40:08.973 回答