为自己的 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: - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entryPoints.web.address=:80" - "--entryPoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.dnschallenge=true" - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare" - "--certificatesresolvers.myresolver.acme.email=postmaster@example.com" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" - "--certificatesresolvers.runci.acme.dnschallenge.delaybeforecheck=60" ports: - "80:80" - "443:443" - "8080:8080" environment: - CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN} volumes: - "./letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" labels: - "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
不出意外的话,应该可以申请到证书了,可以检查 ./letsencrypt/acme.json 文件中的内容,如果没有可以将 Traefik 的 LOG 等级调整为 DEBUG 并关注日志。
总结
DNS Chanllenge 配合 Traefik 可以很方便地为 Homeserver 的服务提供 https 能力,解决自己搭建的 WebDAV / S3 服务因为协议的问题无法使用的情况,并且可以将 VaultWarden 等较为敏感的服务置于内网中,配合设备端的分流代理提供更加安全又便利的体验。
参考