使用 nginx 的动态 ssl 证书

Ali*_*lin 4 ssl nginx docker devops

我有一个类似 Shopify 的应用程序。因此,我的客户在创建商店(即customer1.myShopify.com)时会获得子域。

使用 nginx 处理动态子域的这种情况:

server {
    listen 443 ssl;
    server_name admin.myapp.com;

    ssl_certificate /etc/letsencrypt/live/myapp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/myapp/privkey.pem;

    location / {
        proxy_pass http://admin-front-end:80/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
}


server {
    listen 443 ssl;
    server_name *.myapp.com;

    ssl_certificate /etc/letsencrypt/live/myapp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/myapp/privkey.pem;

    location / {
        proxy_pass http://app-front-end:80/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,因此如果您访问,admin.myapp.com您将看到管理应用程序,如果您访问任何应用程序,xxx.myapp.com您将看到商店前端应用程序。

问题

我想允许我的客户连接他们自己的域。所以我告诉他们连接CNAMEA Record

A Record=> @=>12.12.12.3(my root nginx ip)

CNAME=> WWW=>thier.myapp.com

不是每个请求customer.com都会由我的 nginx 解决。

所以我将此配置添加到我的 nginx 中,以捕获所有其他 server_name 请求:

server {
        listen  80;
        server_name  server_name ~^.*$;
        location / {
            proxy_pass http://app-front-end:80/;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
        }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常。

但我SSL该如何处理这种情况?因为它可以是任何域名。我不知道客户的域名是什么。

我如何让他们能够自动添加 SSL 证书而不需要手动创建?

Rah*_*rma 5

这个服务器块应该可以工作,因为ssl_certificatessl_certificate_key指令支持变量名。

server {
    listen  443;
    server_name  server_name ~^.*$;

    map "$host" $domain_name { ~(.*)\.(.*)\.(.*)$ $2.$3; }

    ssl_certificate /path/to/cert/files/$domain_name.crt;
    ssl_certificate_key /path/to/cert/keys/$domain_name.key;

    location / {
        proxy_pass http://app-front-end:80/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
}
Run Code Online (Sandbox Code Playgroud)

PS使用变量名会影响性能,因为现在 nginx 会在每次 ssl 握手时加载文件。

参考: https : //nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate