nginx使用不同的证书配置通配符域



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

我试图设置一个";CCD_ 1";使用server_name通配符的每个虚拟主机的子域

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

由于我所有的域都有自己的ssl证书,我也希望为webmail子域使用正确的证书。证书被配置为通配符证书,如*.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.*子域的配置文件来实现这种配置?

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

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

(我相信OpenResty中有一些Lua函数可以处理证书处理,但我认为这更多的是关于证书生命周期,而不是根据每个请求动态选择一个。(

实现这一点的方法是编写conf生成脚本,使用perl、python、bash或任何您熟悉的工具。描述一个只需要给定域名的通用webmail0块模板,并为每个域生成该模板的副本。它们可以全部放在一个文件中,也可以是单独文件中的included,无论什么对您都有效。

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

最新更新