NGINX 上具有共享设置的多个 SSL?

NGINX 上具有共享设置的多个 SSL?

我有一台 NGINX 开发服务器。我有大量配置指令来驱动服务器的各种功能。

我希望能够通过 SSL 访问服务器。问题是我可能会从不同的域名访问服务器。例如,在我的 LAN 中我可能使用 192.168.1.100,但在 Internet 上(通过 NAT 转发)我会使用我的主域名,或者在某些特定情况下使用服务器的外部 IP 地址。

由于 SSL 取决于客户端请求的主机名,因此我希望能够根据服务器的访问方式生成并提供多个 SSL 证书。例如,一个证书的 CN 将是“https://192.168.1.100“而另一个人的答案是”https://www.example.com“而另一个可能是”https://12.34.56.78“。

我认为可以通过复制这样的服务器块来实现这一点:

server {
    listen 443 ssl;
    server_name 192.168.1.10;
    ssl_certificate /etc/nginx/192.168.1.10.crt;
    ssl_certificate_key /etc/nginx/192.168.1.10.pem;
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
}
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/www.example.com.crt;
    ssl_certificate_key /etc/nginx/www.example.com.pem;
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
}
...

问题是我有一些(即超过 10 个)location块,因为我正在同一台服务器上测试多个配置、环境和 Web 应用程序。这些位置中的大多数都包含 FastCGI 传递和/或aliasrewrite指令。

复制所有的location块不仅繁琐而且如果我忘记更新每一个块可能会导致不一致。

此外,我还计划将来以实际使用子域的方式使用此环境,每个子域都有不同的位置块。所以现在我们得到了这样的结果:

  • www.example.com 使用location参数集 1
  • 12.34.56.78 使用location参数集 1
  • test.example.com 使用location参数集 2
  • 192.168.1.100 使用location参数集 2

只要我不使用 SSL,这就不是问题,因为服务器将始终使用“默认”服务器块提供服务。但 SSL 似乎要求server每个域名都有一个单独的块,以便提供唯一的证书……

理想情况下,我想要的是某种“命名分组/包含”,我可以location在单独的部分中写入所有块,然后包括将它们放在server块内。我的“理想”解决方案(如果存在):

config config1 {
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
    location /testapp1 {
        include fastcgi_params;
        fastcgi_split_path_info ^(/testapp1)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/testapp1.sock;
    }
}
config config2 {
    location / {
        root   /var/www/root2;
        index  index.html index.htm;
    }
    location /testapp2 {
        include fastcgi_params;
        fastcgi_split_path_info ^(/testapp2)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/testapp2.sock;
    }
}

server {
    listen 443 ssl;
    server_name 192.168.1.100;
    ssl_certificate /etc/nginx/192.168.1.10.crt;
    ssl_certificate_key /etc/nginx/192.168.1.10.pem;
    include config config1;
}
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/www.example.com.crt;
    ssl_certificate_key /etc/nginx/www.example.com.pem;
    include config config1;
}
server {
    listen 443 ssl;
    server_name test.example.com;
    ssl_certificate /etc/nginx/test.example.com.crt;
    ssl_certificate_key /etc/nginx/test.example.com.pem;
    include config config2;
}
...

答案1

server由于 SSL 指令仅在或上下文中可用http,因此您无法解决必须为每个证书编写一个块的问题。

但是,您可以将始终相同的内容(?)移动到不同的文件。然后该文件将include在每个块中保存。所以这几乎就像您设想的解决方案。

您可能还想考虑使用对多个主题有效的证书,使用主题备用名称字段。不过,在商业化时,这相当昂贵。

答案2

我会使用带有主题备用名称的多域证书。然后,您只需要一个服务器块来处理所有不同的主机名。除了我需要的任何其他域之外,我经常使用通配符主机规范 (*.domain.com) 创建这些服务器块。这使得可以轻松地将同一证书用于 www.domain.com、dev1.domain.com、staging.domain.com 等。

虽然目的不同,但这个问题的程序如下:

如何为 IIS 网站创建具有主题备用名称 (SAN) 的自签名 SSL 证书

相关内容