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

Pas*_*rbo 42 ssl nginx ssl-certificate vhosts

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

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

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

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

Rin*_*g Ø 47

编辑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;
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者在特定情况下,两个域都由相同的数据提供服务

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;
  ...
}
Run Code Online (Sandbox Code Playgroud)



- 你有两个(+)不同的证书

上面的案例(所有证书都有一个IP)仍可通过服务器名称指示与现代浏览器一起使用.SNI让客户端(浏览器)在请求头中发送它想要访问的主机,允许服务器(nginx)在处理证书之前处理vhost.配置与上面相同,只是每个vhost都有一个特定的证书,crtkey.

(nginx支持SNI从0.9.8f,检查你的nginx服务器是否符合SNI)
(另外,SF谈论SNI和浏览器支持)

否则,如果您想要访问旧版浏览器,则需要多个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;
  ...
}
Run Code Online (Sandbox Code Playgroud)

原因在这里得到了很好的解释.

  • 注意:第二个选项 - 在`if`中使用`ssl_certificate`不起作用. (4认同)
  • 根据我的阅读,HTTP_HOST位于请求标头中,标头由SSL加密.因此,在使用正确的SSL证书进行解密之前,您无法检查HTTP_HOST.捕获22. (3认同)