nginx 为通配符域配置不同的证书

Posted

技术标签:

【中文标题】nginx 为通配符域配置不同的证书【英文标题】:nginx configure wildcard domains with different certificates 【发布时间】:2020-12-02 08:52:34 【问题描述】:

在我使用 nginx 的小虚拟主机配置中,我遇到了一个新问题。

我尝试使用server_name 通配符为我的每个虚拟主机设置一个“webmail”子域

server_name ~^(webmail\.)?(?<domain>.+)$;

因为我所有的域都有自己的 ssl 证书,所以我也想为 webmail-subdomains 使用正确的证书。证书配置为通配符证书,如*.domain1.com 等。

所以webmail.domain1.com 应该使用*.domain1.com 的证书,而webmail.domain2.net 应该使用*.domain2.net 证书。

我尝试了以下作为第一个猜测但无法启动 nginx,因为它不接受路径中的变量:

ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;

有没有办法通过一个覆盖所有webmail.* 子域的配置文件来实现此配置?

【问题讨论】:

【参考方案1】:

是的,但不是你希望的方式......

您遇到的问题是 nginx 需要先终止 SSL,然后才能读取流内容以获取 Host 标头以设置 server_name 以决定终止 SSL 所需的证书和密钥。这就是为什么变量和映射永远不会起作用的原因,因为它们在 nginx 需要读取证书的时候还不存在。

(我相信 OpenResty 中有处理证书处理的 Lua 函数,但我认为这更多的是关于证书生命周期,而不是根据您想要的每个请求即时选择一个。)

实现这一点的方法是编写您的 conf 生成脚本,使用 perl、python、bash,无论您喜欢什么。描述一个常见的server 块模板,只需要给出域名,并为每个域生成一个副本。它们可以全部在一个文件中,或者included 来自不同的文件,无论对您有用。

提示:如果你命名一个带有点前缀的conf文件,比如.server-tpl.conf,那么它会被通常的include conf.d/*.conf忽略。这样,您可以将此模板与您的其他 conf 文件一起保存,但只会加载填充的副本。

【讨论】:

谢谢。我已经认为这样的事情是必要的,但希望反对它;-)

以上是关于nginx 为通配符域配置不同的证书的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置SSL证书

centos+nginx申请Let's Encrypt 通配符HTTPS证书

将CNAME条目添加到裸域

双语域通配符SSL证书?

nginx server_name 通配符或包罗万象

SSL证书是不是支持二级或多级域名?