两个域名,两个SSL证书,一个IP

我试图运行两个域名,一个使用通配符证书,另一个使用来自一个IP和一个nginx的常规证书。

安装程序:example1.com,带有常规证书的通配证书example2.com

我目前的通配符设置的nginxconfiguration看起来像这样(我还没有开始添加第二个域):

/etc/nginx/sites-available/example1.com:

server { listen 443 default_server ssl; server_name _; ssl_certificate /etc/nginx/ssl/example1.com/example1.com.crt; ssl_certificate_key /etc/nginx/ssl/example1.com/example1.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Perfect Forward Security ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4"; } server { listen 443; server_name example1.com; error_log /var/log/nginx/example1.com.error.ssl.log; access_log /var/log/nginx/example1.com.access.ssl.log; root /var/www/example1.com/; index index.html; } server { listen 80; server_name example1.com; rewrite ^ https://$server_name$request_uri? permanent; } 

现在我也有一些子域名,这就是为什么我使用通配符证书。 子域configuration看起来像这样:

/etc/nginx/sites-available/sub1.example1.com

 server { listen 443; server_name sub1.example1.com; error_log /var/log/nginx/sub1.example1.com.error.ssl.log; access_log /var/log/nginx/sub1.example1.com.access.ssl.log; root /var/www/sub1.example1.com/; location / { # nothing } } server { listen 80; server_name sub1.example1.com; rewrite ^ https://$server_name$request_uri? permanent; } 

这个设置非常整洁,因为所有的子域都inheritance了example.comconfiguration中的ssl设置,因为它是default_server

现在添加第二个域的最好方法是什么? 如果我只是以相同的方式添加域名,我显然会在启动时出错,因为有一个重复的default_server条目。 如果我从example2.com的configuration中删除了default_server条目,它将回落到example1.com的sslconfiguration。

我想要什么,但不知道如何实现:

对每个域都有一个“主”configuration,我们称之为example1.com-defaultexample2.com-default

这些configuration应该包括不同子域之间通用的所有设置,比如SSLconfiguration,完美转发安全性,以及不同的子域名将只是从相应的主域名inheritance这些设置的较小configuration。

因此, sub1.example1.com将inheritanceexample1.com-default的SSL设置, sub1.example2.com将inheritanceexample2.com-default的SSL设置。

这是可能的,如果这是我怎么做到这一点?

提前致谢!

如果您指的是其他SSL设置而不是证书/密钥,我build议您将其configuration移至nginxconfiguration中的http级别。

这样设置将被inheritance到每个server块。

例如,在Debian和衍生产品中,您可以创build/etc/nginx/conf.d/ssl.conf文件,在这里放置这些行:

 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Perfect Forward Security ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4"; 

conf.d中的文件包含在http级别中。

default_server方法在这里不起作用。

在此之后, server块将如下所示:

 server { listen 443 default_server ssl; server_name _; ssl_certificate /path/to/certificate; ssl_certificate_key /path/to/key; } 

而且,如果您要覆盖某些域的某些设置,则可以在server级别重新input指令。

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

你可以阅读这篇文章,最后你有几个select,在一台服务器上使用多个域,许多IP作为证书或SNI(Server_Name_Indication):

configurationHttps服务器,NGINX DOC