Traefik为服务添加HTTPS支持

Traefik为服务添加HTTPS支持 背景

  • 紧接着Traefik学习这篇文章,尝试使用Let's Encrypt为Traefik的服务添加HTTPS支持
Let's Encrypt
  • Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。它是一项由 Internet Security Research Group(ISRG)提供的服务。以尽可能对用户友好的方式免费提供为网站启用 HTTPS(SSL/TLS)所需的数字证书。
Traefik的支持
  • 创建acme.json文件用来存储证书信息
    touch acme.json chmod 600 acme.json

    • 注意务必设置权限为600,否则会报错
  • traefik Docker Compose配置文件 traefik.yaml:
    version: '3' services: reverse-proxy: image: traefik restart: always ports: - "80:80" - "443:443" networks: - traefik volumes: - ./traefik.toml:/etc/traefik/traefik.toml - /var/run/docker.sock:/var/run/docker.sock - ./config/:/etc/traefik/config/:ro - ./acme.json:/letsencrypt/acme.json container_name: traefik # 网关健康检查 healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"] interval: 3s timeout: 5s # 创建外部网卡 docker network create traefik networks: traefik: external: true

    • 关键部分是使用volume向容器引入acme.json
  • traefik静态配置文件 traefik.toml
    # Let's Encrypt [certificatesResolvers.myresolver.acme] email = "example.com" storage="/letsencrypt/acme.json" [certificatesResolvers.myresolver.acme.tlsChallenge]

    • 这里使用TLSChallenge的方式申请,其余方式参考traefik的文档
  • 【Traefik为服务添加HTTPS支持】为服务添加HTTPS支持,这里还是以Halo博客为例
    version: '3.1'services:halo: image: halohub/halo container_name: halo restart: unless-stopped volumes: - /root/blog/halo:/root/.halo labels: - traefik.http.routers.halo.rule=Host(`blog.demoli.xyz`) - traefik.http.routers.halo.tls=true - traefik.http.routers.halo.tls.certResolver=myresolver - traefik.http.routers.halo.entrypoints=https - traefik.http.services.halo.loadbalancer.server.port=8090 - traefik.http.routers.halo-redirect-https.rule=Host(`blog.demoli.xyz`) - traefik.http.routers.halo-redirect-https.entrypoints=http - traefik.http.routers.halo-redirect-https.service=noop@file - traefik.http.routers.halo-redirect-https.middlewares=https-redirect@file - traefik.http.routers.halo-redirect-https.priority=100 networks: default: external: name: traefik

    • 关键配置是traefik.http.routers.halo.tls=truetraefik.http.routers.halo.tls.certResolver=myresolver
注意事项
  • Let's Encrypt证书的有效期是90天,Traefik官方文档说可以支持证书的自动更新,但是查询资料的过程中,发现有博主说并没有自动更新,这里暂时记录,若90天后出现问题,则再尝试解决
  • 实际上使用letsencrypt申请得到acem.json格式的正数可以使用traefik-certs-dumper镜像转换为一般的pem格式,具体使用方式参考Blog CDN加速
参考
  • 关于Let‘s Encrypt的详细介绍
  • Let's Encrypt 的运作方式- Let's Encrypt - 免费的SSL/TLS证书https://letsencrypt.org ? zh-cn ? how-it-works
  • Traefik Let's Encrypt
  • Docker-compose with let's encrypt: TLS Challenge
  • 在 traefik 中为服务开通 https
  • 如何白piao一个免费的泛域名SSL证书 - 掘金

    推荐阅读