代码之家  ›  专栏  ›  技术社区  ›  user_78361084

如何动态设置ssl_证书的域

  •  1
  • user_78361084  · 技术社区  · 6 年前

    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的值。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Alexander Altshuler    6 年前

    不是每个nginx指令都允许嵌入变量。 ssl_certificate ssl_certificate_key 不要支持它。

    但你可以用 ssl_certificate_by_lua_block ngx.ssl

    主要工作流程:

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

    您始终可以使用诸如lua resty lrucache和/或ngx-lua之类的库 像lua_shared_dict这样的api来缓存der格式的 例如,结果。

        2
  •  2
  •   Oleg Neumyvakin    6 年前

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

        3
  •  1
  •   Tarun Lalwani    6 年前

    环境变量并不像您已经知道的那样在nginx config中解析,并且不是每个指令都支持变量。

    我很久以前就写过一篇文章

    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