我在前一篇文章中介绍了Traefik 2.2带来的一些设置上的便利以及提到了我们可以在静态配置文件中指定获取多域名或者通配符SSL证书。这一篇文章就让我来详细讲解一下怎么用。
推荐阅读
官方文档把目前支持dnsChallenge
的providers都列了出来,如果你的DNS管理商在官方的这个列表上面,你可以参考Containeroo的这篇文章的方法来获取通配符证证书。如果你的DNS管理商不在列表里或者你不知道如何使用API密匙,接下来我会介绍怎么用acme-dns
来解决这个问题。
配置实例
Multiple Domain SSL
这个比较简单,只需要修改一下static configuration
文件即可。当然你需要确保这几个域名可以同时解析到Traefik所在的服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure websecure: address: ":443" http: middlewares: - secureHeaders@file tls: certResolver: letsencrypt domains: - main: yourdomain sans: - "test1.yourdomainn" - "test2.yourdomainn" - "test3.yourdomainn"
|
Wildcard SSL
Traefik的文档上面说使用acme-dns
需要使用两个参数。第一个参数ACME_DNS_API_BASE url
是acme-dns
的网址,另外一个参数ACME_DNS_STORAGE_PATH
是其存放环境变量的文件。我们这里使用acme-dns
官方的url来作为演示。
acmd-dns
environment file
这个文件我把它命名为acme-dns
并放在~/data
这个文件夹下面。官方的教程说我们可以通过``{acme-dns-url}/register`这个endpoint来获取相应的参数,添加CNAME记录,然后就能获取证书。我的方法略有不同,我是用Traefik来帮我们获取acme server的参数。
Static Configuration
我这里申请的证书主域名是根域名,通配符域名放在SAN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure websecure: address: ":443" http: middlewares: - secureHeaders@file tls: certResolver: le-dns domains: - main: yourdomain sans: - "*.yourdomain"
|
我专门为DNS验证添加了新的certResolver
。跟http的验证相比,我这里声明我要用dnsChallenge
以及acme-dns
是DNS验证的provider。
1 2 3 4 5 6 7
| le-dns: acme: email: admin@yourdomain storage: acme.json keyType: EC384 dnsChallenge: provider: acme-dns
|
完整的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| api: dashboard: true
entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure websecure: address: ":443" http: middlewares: - secureHeaders@file tls: certResolver: le-dns domains: - main: yourdomain sans: - "*.yourdomainn" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false file: filename: /configurations/dynamic.yml
certificatesResolvers: letsencrypt: acme: email: admin@yourdomain storage: acme.json keyType: EC384 httpChallenge: entryPoint: http buypass: acme: email: admin@yourdomain storage: acme.json caServer: https://api.buypass.com/acme/directory keyType: EC256 httpChallenge: entryPoint: http le-dns: acme: email: admin@yourdomain storage: acme.json keyType: EC384 dnsChallenge: provider: acme-dns
|
Docker Compose file
我们需要添加两个环境变量到我们Traefik的docker-compose.yml
中去。我把acmd-dns
这个文件挂载到Traefik的container中供它使用。
完整配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| version: '3.3'
services: traefik: image: traefik:latest container_name: traefik restart: always security_opt: - no-new-privileges:true ports: - 80:80 - 443:443 environment: - ACME_DNS_API_BASE=https://auth.acme-dns.io - ACME_DNS_STORAGE_PATH=/acme-dns volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/traefik.yml:/traefik.yml:ro - ./data/acme.json:/acme.json - ./data/acme-dns:/acme-dns - ./data/configurations:/configurations networks: - proxy labels: - "traefik.enable=true" - "traefik.docker.network=proxy" - "traefik.http.routers.traefik-secure.entrypoints=websecure" - "traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain`)" - "traefik.http.routers.traefik-secure.middlewares=user-auth@file" - "traefik.http.routers.traefik-secure.service=api@internal" networks: proxy: external: true
|
Set up DNS
Getting acme-dns
info
以上文件都修改好之后,我们先运行一次docker-compose up
让Traefik获取acme-dns的信息。稍微等个5秒左右我们就可以用CTRL+C
把这个进程停下来。打开acme-dns
文件,我们应该可以看到类似下面这样的信息。
1 2 3 4 5 6 7 8 9
| { "yourdomain": { "FullDomain": "c9877300-2abb-40c6-87e6-321adcd1f625.auth.acme-dns.io", "SubDomain": "c9877300-2abb-40c6-87e6-321adcd1f625", "Username": "9b9fc655-c708-4c20-b37e-1da72851c538", "Password": "MPhWzI2ZwgeZKyGK3cYPLICfXlNbmF5tFutacpFF" } }
|
Create DNS CNAME Record
登录到你的DNS管理账户,创建一个DNS CNAME记录_acme-challenge.yourdomain
指向c9877300-2abb-40c6-87e6-321adcd1f625.auth.acme-dns.io
创建好之后等一会,等到我们可以通过dig看到以下信息就代表这个CNAME记录已经成功生成。
1
| _acme-challenge.yourdomain. 21599 IN CNAME c9877300-2abb-40c6-87e6-321adcd1f625.auth.acme-dns.io
|
Request Cert
最后就是再运行一次docker-compose up -d
证书就可以签发下来了。
感谢观看,希望本文可以帮到你。