Use Existing TLS certificate with Traefik 2

在我之前所有关于Traefik 2的文章里面我都是用Traefik自动在LetsEncrypt或者BuyPass去获取SSL证书。这两个地方获取的证书都是DV的证书,也许有些企业需要使用他们自己更高级的SSL证书。今天的文章讲的就是如何在Traefik上使用自己的证书。

Traefik 2有多种配置方法,本文的配置只适用于我自己对于Traefik的理解和配置

根据官方的说明,看起来我们只需要在Dynamic Configuration里面添加证书的路径即可。

1
2
3
4
5
6
7
8
# Dynamic configuration

tls:
certificates:
- certFile: /path/to/domain.cert
keyFile: /path/to/domain.key
- certFile: /path/to/other-domain.cert
keyFile: /path/to/other-domain.key

事情当然没有这么简单,你需要先做两件事情。

修改docker compose文件

首先我们把SSL证书和私钥放在~/data/ssl/这个文件夹里,然后我们在docker-compose.yml文件的Volume部分把它挂载进Traefik的container。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
# Add folder with dynamic configuration yml
- ./data/configurations:/configurations
# Add SSL certificate to traefik container
- ./data/ssl:/ssl
networks:
- proxy
labels:
...

修改static configuration文件

然后我们来到我们的静态配置文件~/data/traefik.yml,在Entrypoint里面把TLS的certResolver给删除(我这里是选择注释掉这两行),然后添加tls: {}^1即可。请注意我这是用的Traefik 2.2版本default router configuration,也就是说每一个连接到Traefik的service都会默认使用这里的TLS选项。一旦你选择使用自己的证书,Traefik下所有的服务的证书都需要你自己提供。(我尝试了用label给其他服务添加certResolver想着可以override这里的选项,但是不起作用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
https:
address: :443
http:
middlewares:
- secureHeaders@file
tls: {}
# tls:
# certResolver: buypass

providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /configurations/dynamic.yml
...

修改Dynamic Configuration文件

最后轮到修改我们的动态配置文件~/data/configurations/dynamic.yml。由于我在docker-commpose.yml里挂载~/data/ssl/到traefik里面的文件夹的位置是名字是 /ssl/,所以我们需要在这个文件夹里面使用证书。如果忘记挂载的话,dynamic.yml是访问不到我们存放在服务器上的文件的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
user-auth:
basicAuth:
users:
- "admin:$apr1$tm53ra6x$FntXd6jcvxYM/YH0P2hcc1"

tls:
certificates:
- certFile: /ssl/server.pem
keyFile: /ssl/private.key
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12
...

对于SSL证书稍微有点了解的朋友应该知道证书还存在证书链的问题,在Apache里面我们需要在Virtual Host里面指定SSLCertificateChainFile。Traefik跟Nginx的类似,都是把证书链直接放到证书下面即可,如下。

1
2
3
4
5
6
-----BEGIN CERTIFICATE-----
你的SSL证书
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
SSL证书的CA证书
-----END CERTIFICATE-----

之后运行docker-compose up -d应该就可以成功使用证书了。

后记: 我最近开始慢慢的把我写的一些文章做成视频放在B站和YouTube上,因为我很清楚无论文字写的多详细,在实际操作的时候还是会出现各种各样的问题。如果可以跟随视频一步一步地左,对于很多朋友来说可能更有鼓励性,更容易成功。

好啦,本文就写到这里,有什么问题请留言。