【问题标题】:How to dynamically set the domain for ssl_certificate如何为 ssl_certificate 动态设置域
【发布时间】:2018-12-02 12:10:57
【问题描述】:

我通过openresty使用lua并设置环境变量来动态设置域名。我有:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

env MYDOMAIN;

http {
    server {
        listen 80;
        listen 443 ssl;
        set_by_lua $MYDOMAIN 'return os.getenv("MYDOMAIN")';
        server_name $MYDOMAIN www.$MYDOMAIN;
        location / {
          proxy_pass http://127.0.0.1:5000;
          index  index.html index.htm;
        }
        ssl_certificate /etc/letsencrypt/live/$MYDOMAIN/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/$MYDOMAIN/privkey.pem;    
    }
}

我收到一个错误:

nginx: [emerg] BIO_new_file("/etc/letsencrypt/live/$MYDOMAIN/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/$MYDOMAIN/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)

设置 server_name 可以正常工作,但在 ssl_certificate 和 ssl_certificate_key 的情况下,它实际上是采用 $MYDOMAIN 的值。

【问题讨论】:

标签: docker nginx lua openresty


【解决方案1】:

Nginx 1.15.9 版支持“ssl_certificate”和“ssl_certificate_key”指令中的变量。

【讨论】:

    【解决方案2】:

    并非每个 nginx 指令都允许嵌入变量。 ssl_certificatessl_certificate_key 不支持。

    但你可以使用ssl_certificate_by_lua_blockngx.ssl

    主要工作流程:

    1. 在 nginx 配置中指定任何有效的存根证书。
    2. 关注ngx.ssl synopsis,它需要一些证书格式转换。 使用os.getenv("MYDOMAIN") 构建文件路径以打开和读取证书。文件内容。
    3. 缓存转换后的密钥,以避免在每次请求时对同一域进行文件读取和转换。

    你总是可以使用像 lua-resty-lrucache 和/或 ngx_lua 这样的库 像 lua_shared_dict 这样的 API 来做 DER 格式的缓存 例如结果。

    【讨论】:

    • 你能举个例子吗?我想我错过了什么。
    • 顺便说一句,我会为您的用例选择 nginx conf tempalting 方法,因为您的配置是静态的。 ssl_certificate_by_lua_block 专为动态证书选择而设计,例如基于 SNI。
    • 使用带有缓存的 ngx.ssl 的完整示例可能是整页 Lua 代码。如果我有足够的空闲时间,我会写这样的例子。
    【解决方案3】:

    你已经知道环境变量在 nginx 配置中没有解析,并且不是每个指令都支持变量。

    我早就写过一篇文章

    https://tarunlalwani.com/post/simple-parameterized-config-files-docker/

    这个想法是在运行 nginx 之前更新你的配置文件。这样你就会有一个启动脚本

    #!/bin/bash
    
    envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
    exec nginx "-g" "daemon off;"
    

    这将使事情变得容易得多。更严格的方法是使用ssl_certificate_by_lua_block 动态加载证书。

    https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md

    【讨论】:

      【解决方案4】:

      来自文档:从 1.15.9 版本开始,使用 OpenSSL 1.0.2 或更高版本时可以在文件名中使用变量

      例子:

      ssl_certificate     $ssl_server_name.crt;
      ssl_certificate_key $ssl_server_name.key;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-16
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2021-06-08
        • 1970-01-01
        • 2021-06-19
        相关资源
        最近更新 更多