Traefik 2 Request Multiple domain and Wildcard SSL certificates

我在前一篇文章中介绍了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 urlacme-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
# Add folder with dynamic configuration yml
- ./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证书就可以签发下来了。

感谢观看,希望本文可以帮到你。