nginx 在 ssl_certificate 路径上使用 $server_name

nginx 在 ssl_certificate 路径上使用 $server_name

如何在文件路径中使用变量名?

ssl_certificate /home/ec2-user/.certificados/$server_name.crt;
ssl_certificate_key /home/ec2-user/.certificados/$server_name.key;

答案1

您不能在每个指令中都使用变量。ssl_certificate被视为文字字符串,是许多不支持变量的指令之一。

要为主机指定不同的证书,您必须在服务器块中明确写入:

server {
    server_name example.com;
    ssl_certificate /home/ec2-user/.certificados/example.com.crt;
    ssl_certificate_key /home/ec2-user/.certificados/example.com.key;
    # ...
}
server {
    server_name example.net;
    ssl_certificate /home/ec2-user/.certificados/example.net.crt;
    ssl_certificate_key /home/ec2-user/.certificados/example.net.key;
    # ...
}
# ...

如果您不想重复配置,请创建模板并使用这些模板生成 nginx 配置。另请参阅http://nginx.org/en/docs/faq/variables_in_config.html

答案2

您可以使用变量,因为nginx 1.15.9(2019 年 2 月 26 日)

请注意,使用变量意味着每次 SSL 握手都会加载证书,这可能会对性能产生负面影响

但请注意变化nginx 1.15.12(2019年4月16日):

错误修复:如果在“ssl_certificate”或“ssl_certificate_key”指令中使用了变量并且启用了 OCSP 装订,则工作进程中可能会出现分段错误。

答案3

简单的起点

以下是完整、基本的动态 SSL 证书配置。使用的正则表达式会提取 TLDN,例如 seacoast.com,即使请求是www.seacoast.com。如果您想要完整的域名,只需在您的块中的任何位置使用 $ssl_server_name 变量。

map $ssl_server_name $domain {
 default $ssl_server_name;
 ~(([^\.]+)\.([^\.]+))$ $1;
}

server {
 listen 443 ssl http2 default_server;
 listen [::]:443 ssl http2 default_server;
 server_name _;

 add_header Content-Type text/html;
 return 200 "domain: $domain, document_root: $document_root, request_uri: $request_uri";

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

我发现启用 SSL 的块无法提取变量server_name,并会留下一个空白变量,而 http 块则按预期工作。我正在运行 Nginx 1-Alpine Docker,并为数十个域自动生成 letsencrypt 证书。

相关内容