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

标签 ssl nginx wildcard vhosts

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

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

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 header ,以设置 server_name 来决定终止 SSL 需要哪个证书和 key 。这就是为什么变量和映射永远不会起作用,因为当 nginx 需要读取证书时它们还不存在。

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

实现这一目标的方法是使用 perl、python、bash 等您喜欢的任何方式编写conf 生成脚本。描述一个通用的server block 模板,只需要给定域名,并为每个域生成一个副本。它们可以全部包含在一个文件中,也可以从单独的文件中包含,只要适合您即可。

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

关于ssl - nginx使用不同的证书配置通配符域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379362/

相关文章:

ssl - 垃圾。尝试抓取网站时出现 SSL 错误 "DH KEY TOO SMALL"

PHP 连续写入新 session (空)

regex - 转义 [] 的正则表达式是什么?

SQL通配符问题

php - 带 % 通配符的 Mysqli 准备语句

python - 在进行任何 pip 安装时,如何避免这个奇怪的 "Could not fetch URL"错误

ssl - NSUrlSession:仅当还需要客户端证书时,挑战 NSURLAuthenticationMethodServerTrust 才会失败

tomcat - 为什么重定向到 https 会被注销?

wordpress nginx ssl 重定向循环

PHP7 MySQL 'expiry_date' PDO 数据库安装的默认值无效