基于 $host 的 Nginx ssl_certificate?

基于 $host 的 Nginx ssl_certificate?

您好,我该如何做ssl_certificate才能做到:ssl_certificate_key$host

if $host = domain.com than set one path, if $host = example.com than set another path

我在用nginx/1.15.8

如果我为域创建不同的块,则重新加载时会收到错误:

nginx: [emerg] duplicate zone "cache"因此我需要 1 个块并根据域加载证书。

答案1

您可以使用map指令替换:

map $host $certfile {
    domain.com    /path/to/certificate_1;
    example.com   /path/to/certificate_2;
}
map $host $keyfile {
    domain.com    /path/to/key_1;
    example.com   /path/to/key_2;
}

server {
    ...
    ssl_certificate        $certfile;
    ssl_certificate_key    $keyfile;
    ...
}

更新 1

正如@AlexeyTen 所说,此配置需要 nginx >= 1.15.9,因此它不适用于 nginx 1.15.8(或最新的 openresty 生产版本 1.15.8.3)。如果您使用 openresty,则使用此配置的唯一方法是手动构建和安装 1.17.8.1 RC1。

更新 2

另外,您可以申请一个对两个域名都有效的新证书。我自己也这样做了bash 脚本使用以下命令:

acme.sh --issue -d domain.com -d example.com --webroot /my/web/root

答案2

总体而言,投票的解决方案是不正确的:除非发生 tls 终止,否则不会填充 $host 变量。

正确的解决方案如下所述:https://jjj.blog/2019/05/variable-ssl-certificate-directives-in-nginx-part-2/

相关内容