我试图运行两个域名,一个使用通配符证书,另一个使用来自一个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-default和example2.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