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

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

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

设置:example1.com 使用通配符证书 example2.com 使用常规证书

我当前的通配符设置的 nginx 配置如下所示(我还没有开始添加第二个域):

/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;
}

现在我还有几个子域名,所以我使用通配符证书。子域名配置如下所示:

/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;
}

这个设置非常简洁,因为所有子域都从配置中继承了 ssl 设置,example.com因为它是default_server

现在添加第二个域名的最佳方法是什么?如果我以相同的方式添加域名,我显然会在启动时收到错误,因为有一个重复的default_server条目。如果我从 的配置中删除该default_server条目example2.com,它将恢复到 的 ssl 配置example1.com

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

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

这些配置应该包括不同子域之间通用的所有设置,比如 SSL 配置、完美前向安全性……而不同的子域只是从各自的主域继承这些设置的较小的配置。

因此sub1.example1.com将从 继承 SSL 设置,example1.com-default并将sub1.example2.com从 继承 SSL 设置example2.com-default

这可能吗?如果可能的话,我该如何实现?

提前致谢!

答案1

如果您指的是证书/密钥以外的其他 SSL 设置,我建议您将其配置移至httpnginx 配置级别。

这样,设置将被继承到每个server块。

例如,在 Debian 及其衍生版本中您可以创建/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

答案2

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

您可以阅读这篇文章,最后您有几个选择,在一个服务器中使用多个域,多个 IP 作为证书或 SNI(Server_Name_Indication):

配置 Https 服务器,NGINX DOC

相关内容