【问题标题】:Traefik/SSL/LetsEncrypt FaultyTraefik/SSL/LetsEncrypt 故障
【发布时间】:2019-03-16 20:10:07
【问题描述】:

我正在尝试使用 traeffik 设置letsEncrypt,但无论我做什么,它似乎都不起作用。目前我收到以下错误:

其他 SO 帖子提到这可能是由于未对 traeffik (Traefik will issue certificate instead of Let's encrypt) 使用 http 挑战,但我正在使用它,所以老实说我不知道​​(这不能解决问题 - 不要关闭)。我的配置文件似乎很小,但我没有收到错误反馈,因此我在中断上进行迭代的能力很小。如果有人可以就如何解决这个问题提供任何帮助,我将不胜感激 - 我已经有一段时间了,我不知道该怎么做。

我使用这个小 bash 脚本启动了以下三个文件:

root@ubuntu-1gb-nyc3-01:/lowteck# cat ./runSwarm.sh 
#!/bin/bash

./buildandpush.sh
cd ./back
./buildandpush.sh
cd ..

docker volume prune -f
docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
 docker swarm init \
   --advertise-addr 104.236.214.151
docker network create -d overlay --attachable proxy
docker stack deploy --compose-file=stage.yaml prod2 
docker stack deploy --compose-file=traefik.yaml prodTraefik

这是我的traefik.toml

root@ubuntu-1gb-nyc3-01:/lowteck# cat traefik.toml 
logLevel = "DEBUG"
defaultEntryPoints = ["http", "https"]

[web]

[entryPoints]
  [entryPoints.http]
  address = ":80"
  [entryPoints.http.forwardedHeaders]
    trustedIPs = ["104.236.214.151"]
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[acme]
  caServer = "https://acme-v02.api.letsencrypt.org/directory"
  email = "pweyand@gmail.com"
  storage = "acme.json"
  entryPoint = "https"
  onHostRule = true 
  [acme.httpChallenge]
    entryPoint = "http"

[[acme.domains]]
  main = "lowteck.com"
  sans = ["www.lowteck.com"]

[docker]
  domain = "traefik"
  watch = true
  swarmmode = true
  network="web"

这是我的traefik.yaml

root@ubuntu-1gb-nyc3-01:/lowteck# cat traefik.yaml 
version: '3.3'

networks:
  proxy:
    external: true

configs:
  traefik.toml:
    file: ./traefik.toml

services:

  traefik:
    image: traefik
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    configs:
      - source: traefik.toml
        target: /etc/traefik/traefik.toml
    labels:
      - "traefik.enable=false"
    networks:
      - proxy
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager] 

这是我的stage.yaml

root@ubuntu-1gb-nyc3-01:/lowteck# cat stage.yaml 
version: "3.3"

networks:
  default:
    external: false
  proxy:
    external: true

services:
  back:
    image: patientplatypus/lowtechback:latest
    ports: 
      - '5000:5000'
    networks:
      - proxy
      - default
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        max_attempts: 5
        window: 120s
      labels:
        - "traefik.docker.backend=back"
        - "traefik.port=5000"
        - "traefik.frontend.rule=Host:back.lowteck.com"
        - "traefik.docker.network=proxy"
  front:
    image: patientplatypus/lowtechfront:latest
    ports: 
      - '3000:3000'
    networks:
      - proxy
      - default
    depends_on:
      - back
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        max_attempts: 5
        window: 120s
      labels:
        - "traefik.docker.backend=front"
        - "traefik.port=3000"
        - "traefik.frontend.rule=Host:104.236.214.151, lowteck.com, www.lowteck.com, zennify.me"
        - "traefik.docker.network=proxy"

再一次,我已经有一段时间了,我基本上没有错误代码可以继续。如果有人有任何建议,请告诉我。

编辑:

我在注销 traefik pod 后发现了一个错误 - 即我需要:

[[acme.domains]]
  main = "lowteck.com"
  sans = ["www.lowteck.com", "back.lowteck.com"]

然而,尽管 traefik 容器的日志现在已经清楚,但这并没有解决 https 问题。您可以在此处查看完整的日志输出:https://gist.github.com/patientplatypus/8a40e12c6ba64cdc7d2bf88581967057

【问题讨论】:

  • 可以贴一下traefik容器启动时的日志吗?它应该显示其关于 ACME/Let's Encrypt 的活动
  • @Thomasleveil - 感谢您的建议 - 尽管我在尝试访问 https 时遇到了同样的错误,但它帮助调试了至少一个潜在的错误。您可以在我的 EDIT 中查看上面的完整日志。
  • 试试"traefik.frontend.rule=Host:lowteck.com,www.lowteck.com,zennify.me,104.236.214.151"。如果可行,我将详细说明导致问题的原因
  • 现在,我知道证书是从日志中生成的——我假设是因为证书以某种方式被散列为唯一的,无论域本身如何(愚蠢)——但我仍然知道 https 是由 traefik 自签名的,而不是在浏览器中导航时让 LetEncrypt 。日志,因为为什么不 (gist.github.com/patientplatypus/…)
  • 在你的 toml 文件的[acme] 部分下添加acmeLogging = true,它可能会给出新的提示

标签: docker ssl networking proxy docker-compose


【解决方案1】:

所以我终于解决了这个问题,我想向遇到此问题的任何人指出一些有助于解决问题的事情。

1) 您应该使用docker service logs YOURTRAEFFICPOD 记录您的 traefik pod,以获取所有要调试的错误。出于某种原因,我没有想到这一点(愚蠢)。

2) acme sans 部分不是由 pod 定义的,而是由域的 A 记录中的内容定义的。如果它不在 A 记录中,请不要将其放在那里 - 这将在日志中显示为错误。

3) 确保您使用的是最新版本的 traefik - 在我的情况下,我必须通过更改 traefik.toml 来将 traefik 版本更改为 1.7.9 以拥有 image: traefik:v1.7.9

4) 如果您使用 http 质询,您的 acme.json 文件将会并且应该是空的 - 所以不用担心。

5) 最后,如果您收到错误,即您已从letsEncrypt 为您的域提供了最大数量的证书请求,这实际上可能不会强制您的域没有https - 您应该检查它,因为它可能仍然存在能够使用以前的证书。

就是这样,感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多