如何在文件路径中使用变量名?
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 证书。