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

我想使用 nginx 来服务一个有多个域名和 SSL 的网站:

  • Webmail.example.com
  • Webmail.beispiel.de

它们都使用相同的 vhost,因此我只设置 server _ name 两次。 问题是,我需要 nginx 为每个域名提供正确的 ssl 证书。

这是否可能与一个主机或我需要设置两个主机?

145444 次浏览

编辑 November 2014 : 最初的答案不正确,也不完整; 它需要刷新。

基本上,有两个案子

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

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

    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都有一个特定的证书 对不起钥匙

(Nginx 从0.9.8 f 开始支持 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;
...
}

原因就在于 在这里解释

TLS SNI

SNI 允许浏览器在 SSL 握手过程中传递请求的服务器名称

Nginx 支持 TLS SNI

检查 Nginx 是否启用了 TLS SNI

$ nginx -V
...
TLS SNI support enabled
...

检查 error_log在没有这个警告的情况下

nginx was built with SNI support, however, now it is linked
dynamically to an OpenSSL library which has no tlsext support,
therefore SNI is not available

官方 HTTPS 文档 有更多细节。

如果启用了 TLS SNI,下面的配置可以正常工作。

# Create the self signed certificate


openssl req -x509 -newkey rsa -nodes -keyout default.key -days 36500 -out default.crt -subj "/CN=example.org"


openssl req -x509 -newkey rsa -nodes -keyout a.key -days 36500 -out a.crt -subj "/CN=a.example.org"


openssl req -x509 -newkey rsa -nodes -keyout b.key -days 36500 -out b.crt -subj "/CN=b.example.org"
    server {
listen       443 ssl default_server;
server_name  "";


ssl_certificate      default.crt;
ssl_certificate_key  default.key;


add_header "Content-Type" "text/plain";
return 200 "default page";
}


server {
listen       443 ssl;
server_name  a.example.org;


ssl_certificate      a.crt;
ssl_certificate_key  a.key;


add_header "Content-Type" "text/plain";
return 200 "a.example.org page";
}


server {
listen       443 ssl;
server_name  b.example.org;


ssl_certificate      b.crt;
ssl_certificate_key  b.key;


add_header "Content-Type" "text/plain";
return 200 "b.example.org page";
}
# Add -v to verify the certificate


$ curl --insecure --resolve "a.example.org:443:127.0.0.1" https://a.example.org


a.example.org page


$ curl --insecure --resolve "b.example.org:443:127.0.0.1" https://b.example.org


b.example.org page


$ curl --insecure https://127.0.0.1


default page


档号: Nginx TLS SNI

如果 Nginx 禁用 TLS SNI

Nginx 将对所有请求使用默认的 server证书

官方 HTTPS 文档

这是由 SSL 协议行为造成的。SSL 连接是在浏览器发送 HTTP 请求之前建立的,nginx 不知道请求的服务器的名称。因此,它可能只提供默认服务器的证书。