docker - 在 Docker Swarm 上的 Traefik v2 中使用通配符证书

标签 docker docker-swarm lets-encrypt traefik

我正在使用以下 Docker Compose 文件在 swarm 集群上部署 Traefik。

version: "3.7"

services:
  traefik:
    image: traefik:v2.1
    command:
      - "--api.dashboard=true"
      - "--accesslog=true"
      - "--log.level=INFO"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=traefik-public"
      - "--providers.file.watch=true"
      - "--providers.file.filename=/file_provider.yml"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.dnsChallenge.provider=cloudflare"
      - "--certificatesresolvers.letsencrypt.acme.dnsChallenge.delayBeforeCheck=15"
      - "--certificatesresolvers.letsencrypt.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53"
      - "--certificatesresolvers.letsencrypt.acme.email=user@domain.tld"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - 80:80
      - 443:443
    volumes:
      - traefik-certificates:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik-public
    environment:
      - "CF_API_EMAIL=user@domain.tld"
      - "CF_API_KEY=api-key"
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        - "traefik.enable=true"
        - "traefik.docker.lbswarm=true"
        - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
        - "traefik.http.routers.http-catchall.entrypoints=web"
        - "traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker"
        - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
        - "traefik.http.routers.api.tls.certresolver=letsencrypt"
        - "traefik.http.routers.api.tls.domains[0].main=*.domain.tld"
        - "traefik.http.routers.api.tls.domains[0].sans=domain.tld"
        - "traefik.http.routers.api.rule=Host(`management.domain.tld`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
        - "traefik.http.routers.api.service=api@internal"
        - "traefik.http.services.api.loadbalancer.server.port=8080"
    configs:
      - file_provider.yml

volumes:
  traefik-certificates:

configs:
  file_provider.yml:
    file: /home/access/docker/traefik-provider.yml

networks:
  traefik-public:
    external: true


目前,我已经达到了 management.domain.tld 的速率限制我反而想使用通配符证书,因此我再次遇到速率限制的可能性较小。我已将 Traefik 配置为生成有效的通配符证书,但 management.domain.tld 上仍然存在速率限制错误在日志中。另外,当我去management.domain.tld在浏览器中,我收到无效的 SSL/TLS 错误。如何让 Traefik 使用通配符证书而不是为每个主机规则颁发新证书?

最佳答案

看起来你做对了一切。但是配置上有一个小错误。
mainSubject证书字段。意思是证书颁发给的域/子域。
sansSubject Alternate Names证书字段。意味着证书也有效的替代域/子域。

所以,而不是使用:

version: "3.7"

services:
  traefik:
    image: traefik:v2.1
    ...
      labels:
        - "traefik.http.routers.api.tls.domains[0].main=*.domain.tld"
        - "traefik.http.routers.api.tls.domains[0].sans=domain.tld"
    ...

你应该使用:
version: "3.7"

services:
  traefik:
    image: traefik:v2.1
    ...
      labels:
        - "traefik.http.routers.api.tls.domains[0].main=domain.tld"
        - "traefik.http.routers.api.tls.domains[0].sans=*.domain.tld"
    ...

关于docker - 在 Docker Swarm 上的 Traefik v2 中使用通配符证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59121604/

相关文章:

docker - 为Haskel Web应用程序构建Docker镜像的最佳实践是什么

docker - Jenkins 管道 - groovy.lang.MissingPropertyException

docker - 如何将 Kubernetes 或 Docker Swarm 服务置于防火墙后面

ssl - 未捕获( promise )DOMException : Failed to register a ServiceWorker: An SSL certificate error occurred when fetching the script

google-chrome - SSL、谷歌浏览器和 "non-secure"页面/表单

docker - 如何让 docker COPY 忽略文件权限?

docker - Makefile 中的 "docker images"为空

performance - 进程在 ubuntu 18.04 上的 docker 容器中运行缓慢

amazon-web-services - 在 AWS 的 Docker 中找不到节点的 Docker 根目录

lets-encrypt - 让我们用 Traefik 加密