
我写这篇文章更多的是作为自己的文档,因为我有几个域,我经常把它们作为某些事情的游乐场。这可能是一个kubernetes环境或一个docker集群,我在其中部署了几个应用程序,但不想为我部署的每个应用程序建立一个nginx站点。
最近,我发现了用于管理docker环境的Portainer。可以把它看作是kubernetes-lite。这并不适合任何类型的生产用例,但对于在家管理本地的docker实例确实有一些好处。

所以在这个例子中,我们有一个请求从443进来。这个请求可能使用的是域名c1.mydomain.com ,还有一个请求可能来自c2.mydomain.com 。
以前,你会为这两个子域准备一个证书,并需要为每个子域设置适当的端口转发到相应的服务器。这是一个巨大的痛苦,所以,这就是通配符证书可以派上用场的地方。
在这个特定的情况下,我有一个nginx代理,它将被用来路由所有进入我的网络的流量。这很方便,因为我可以使用这个反向代理进行SSL终端,也可以根据域名将流量路由到各种服务器。这不一定是一个强大的服务器。你甚至可以使用Raspberry Pi来路由这些流量。同样,这是为家庭服务器准备的,并不是真正的生产级。
你将需要一些先决条件。而且我还使用CloudFlare的DNS来处理这些通配符域名。这很好,因为certbot和cloudflare发挥得很好,通过他们的API自动验证挑战。
apt install certbot letsencrypt python3-certbot-dns-cloudflare
如果你已经安装了certbot和必要的扩展,你可以简单地运行这个脚本来获得一个通配符证书。
sudo certbot certonly \
--cert-name mydomain.com \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflareapi.cfg \
--server https://acme-v02.api.letsencrypt.org/directory \
-d "*.mydomain.com" \
-d mydomain.com
所以,现在我们可以配置nginx代理来接收来自这个域名的任何请求,并将其转发给我的docker主机。
server {
server_name *.mydomain.com;
server_name ~^(?<subdomain>.+)\.mydomain\.com$;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# proxy_next_upstream error timeout http_502;
location / {
proxy_pass http://DOCKER_HOST_IP_ADDRESS;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
return 301 https://$host$request_uri;
listen 80 ;
listen [::]:80 ;
server_name *.mydomain.com;
server_name ~^(?<subdomain>.+)\.mydomain\.com$;
}