0%

Traefik 通过 DNS Chanllenge 为内网提供证书

为自己的 Homeserver 提供 https 证书服务可能是一个比较繁琐的工作,但提供 https 服务能力可能是诸如文件同步,密码管理等的必须要求,尽管这项服务实际上是由自行搭建的内网服务。

如果使用自签证书,各个设备系统的导入程度/信任程度也各不相同。幸好,我们可以通过 Let’s encrpyt 提供的一系列 Chanllenge 证明我们拥有某些域名从而获得 SSL 证书。其中,DNS-01 挑战 特别适合对内网或者不能直接被公网访问的服务器

接下来我们将使用 Traefik 自带的 acme 方案搭配 Cloudflare 实现证书的自动生成并自动续期。

生成 Cloudflare token

这里将默认我们已经购买了一个域名并已经交由 cloudflare 托管。打开 Cloudflare 管理面板 点击左下角 Manage Account –> Account API tokens –> Create_token。
选择 Edit zone DNS 模版,为我们的域名赋予修改的权限,复制 Token 备用。

Traefik 配置

在 Traefik Compose 文件中增加如下选项

services:

traefik:
image: "traefik:v3.5"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.web.address=:80"
- "--entryPoints.websecure.address=:443"

# 开启 DNS 挑战
- "--certificatesresolvers.myresolver.acme.dnschallenge=true"
# 指定 provider
- "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
# 这里提供邮箱
- "--certificatesresolvers.myresolver.acme.email=postmaster@example.com"
# 指定证书的存储地址,这里建议放入下面 volumes 持久化存储
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
# 延后验证时间以便 DNS 记录生效
- "--certificatesresolvers.runci.acme.dnschallenge.delaybeforecheck=60"
ports:
- "80:80"
- "443:443"
- "8080:8080"
environment:
# 这里记得放入上一步获取的 token
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
# label 这里我们选择显式触发去生成 wildcard 证书
- "traefik.tls.stores.default.defaultgeneratedcert.resolver=myresolver"
- "traefik.tls.stores.default.defaultgeneratedcert.domain.main=lab.cc"
- "traefik.tls.stores.default.defaultgeneratedcert.domain.sans=*.lab.cc"

启动 Traefik

docker compose up -d

不出意外的话,应该可以申请到证书了,可以检查 ./letsencrypt/acme.json 文件中的内容,如果没有可以将 Traefik 的 LOG 等级调整为 DEBUG 并关注日志。

总结

DNS Chanllenge 配合 Traefik 可以很方便地为 Homeserver 的服务提供 https 能力,解决自己搭建的 WebDAV / S3 服务因为协议的问题无法使用的情况,并且可以将 VaultWarden 等较为敏感的服务置于内网中,配合设备端的分流代理提供更加安全又便利的体验。

参考