无法将 Traefik 设置为仅使用 DuckDNS+LetsEncrypt 请求通配符证书

问题描述 投票:0回答:1

基本上我一直在研究一点 Traefik,因为它看起来比我使用的其他反向代理更专业一点,而我仍然面临的唯一问题是仅为我的 WILDCARD DuckDNS 生成证书。

示例: 我想要为

*.mydomain.duckdns.org
生成一个证书,并且该证书将由所有选定的服务/容器使用。就我而言,出于学习目的,我只有
Portainer
Traefik Whoami
服务,因此它们的 URL 分别是:

  • portainer.mydomain.duckdns.org
  • whoami.mydomain.duckdns.org

当前行为是:Traefik 正在为第一个 URL 请求一个证书,为第二个 URL 请求另一个证书。

目标:仅创建一个通配符证书并将其用于两个 URL。

我现在更喜欢使用静态和动态文件而不是 docker 标签来完成所有配置,因为它对于初学者来说似乎更容易理解,所以这是我的文件:

# docker-compose.yml
networks:
  selfhost:
    external: true

services:
  portainer:
    image: portainer/portainer-ce:2.21.5
    container_name: portainer
    networks:
      - selfhost
    volumes:
      - ./portainer/data:/data:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped
    ports:
      - 9000:9000
  whoami:
    image: traefik/whoami
    container_name: whoami
    networks:
      - selfhost
    restart: unless-stopped
  traefik:
    image: traefik:v3.2
    container_name: traefik
    networks:
      - selfhost
    volumes:
      - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
      - ./traefik/dynamic.yml:/config/dynamic.yml:ro
      - ./traefik/letsencrypt:/letsencrypt:rw
    restart: unless-stopped
    ports:
      - 8080:8080
      - 80:80
      - 443:443
    environment:
      DUCKDNS_TOKEN: duckdnstoken
  duckdns:
    image: linuxserver/duckdns:version-5046d23b
    container_name: duckdns
    networks:
      - selfhost
    restart: unless-stopped
    environment:
      PUID: 1000
      PGID: 1000
      TZ: America/Sao_Paulo
      SUBDOMAINS: mydomain
      TOKEN: duckdnstoken
      UPDATE_IP: ipv4
# traefik.yml
entryPoints:
  web:
    address: :80

  websecure:
    address: :443

certificatesResolvers:
  letsencrypt:
    acme:
      email: myemail
      storage: /letsencrypt/acme.json
      dnsChallenge:
        provider: duckdns
        disablePropagationCheck: true
        delayBeforeCheck: 60s
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"

api:
  insecure: true

providers:
  file:
    filename: /config/dynamic.yml
    watch: true

log:
  level: DEBUG
# dynamic.yml
http:
  routers:
    whoami:
      rule: Host(`whoami.mydomain.duckdns.org`)
      service: whoami
      entryPoints:
        - websecure
      tls:
        certResolver: letsencrypt

    portainer:
      rule: Host(`portainer.mydomain.duckdns.org`)
      service: portainer
      entryPoints:
        - websecure
      tls:
        certResolver: letsencrypt

  services:
    whoami:
      loadBalancer:
        servers:
          - url: http://whoami:80

    portainer:
      loadBalancer:
        servers:
          - url: http://portainer:9000

老实说,这就是我到目前为止所能得到的......我已经在整个互联网上查看了很多主题和线程,例如 Stack Overflow、Reddit、Discord 社区、Traefik 社区,但没有任何配置真正起作用。

我使用的这个设置实际上有时可以工作(这意味着它偶尔可以工作一次)为每个 URL 生成证书,但必须使用

disablePropagationCheck
delayBeforeCheck
看起来更像是一种解决方法,而不是实际功能在这种情况下。如果没有它们,我只会陷入
whoami
的单个证书,而
portainer
无法生成,因为超出了 ACME 响应的时间限制。当前的设置实际上给了我同样的错误,但几分钟后它会重试请求并成功获得
portainer
...

的证书

你可以在这里看到Traefik的日志,这样你就可以理解“错误”了,这样的话,只能又报错,这次没有成功!:https://pastebin.com/Th9HDJLj

traefik lets-encrypt wildcard-subdomain duck-dns
1个回答
0
投票

对于通配符 LetsEncrypt TLS 证书,您需要使用

dnsChallenge
并指定
main
/
sans
(doc):

tls:
  certResolver: myresolver
  domains:
    - main: "example.com"
      sans:
        - "*.example.org"

我建议在入口点全局设置 TLS(示例)。

Traefik 和 LetsEncrypt 将识别

Host()
域包含在通配符中,并且不会创建单独的证书。

© www.soinside.com 2019 - 2024. All rights reserved.