在Traefik中使用现有的LetsEncrypt证书

时间:2018-05-29 02:53:05

标签: lets-encrypt traefik

是否可以在Traefik中使用现有的LetsEncrypt证书(.pem格式)?

我设置Traefik / Docker来生成acme.json - 我可以导入一组域的现有证书吗?

3 个答案:

答案 0 :(得分:1)

最终,我找到了正确的解决方案-不使用Traefik的ACME集成,而是简单地装入包含certbot手动模式下颁发的证书的网络卷(EFS)。

为什么这是我选择的方法?因为我要在两个服务器(蓝色和绿色)上安装该证书持有NFS卷。这些服务器是Web服务器的实时和登台服务器。在任何时候,一个都可以“运行”,而另一个可以运行候选版本,或者以“热备用”角色运行。

因此,最好将问题分开,并让第三台服务器作为专用的“证书管理器”运行。基本上永远不会碰到这台t2.nano服务器,它全权负责每周运行一次certbot,将证书写入两个Web服务器共享的NFS挂载(以只读模式)。

通过这种方式,Traefik可以在蓝色和绿色服务器上运行,以解决代理Web通信的主要问题,并仅指向由certbot颁发的证书文件。对于那些找到此页面并可能受益于相同解决方案的用户,以下是我的traefik.toml文件中的相关摘录:

defaultEntryPoints = ["https","http"]

[docker]
watch = true
exposedbydefault = false
swarmMode = true

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
  [entryPoints.https.tls]
    [[entryPoints.https.tls.certificates]]
    certFile = "/cert.pem"
    keyFile = "/privkey.pem"

这是我的Docker swarm堆栈文件中的相关部分:

version: '3.2'

volumes:
 composer:

networks:
  traefik:
    external: true

services:
  proxy:
    image: traefik:latest
    command: --docker --web --docker.swarmmode --logLevel=DEBUG
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      - "./certs/live/example.com/fullchain.pem:/cert.pem"
      - "./certs/live/example.com/privkey.pem:/privkey.pem"
    networks:
      - traefik

最后,这是cron每周在专用证书服务器上运行的命令,该服务器配置为将ACME v2用于通配符证书,并将Route 53集成用于挑战自动化:

sudo docker run -it --rm --name certbot                                      \
            -v `pwd`/certs:/etc/letsencrypt                                  \
            -v `pwd`/lib:/var/lib/letsencrypt                                \
            -v `pwd`/log:/var/log/letsencrypt                                \
            --env-file ./env                                                 \
            certbot/dns-route53                                              \
            certonly --dns-route53                                           \
                     --server https://acme-v02.api.letsencrypt.org/directory \
                     -d example.com                                          \
                     -d example.net                                          \
                     -d *.example.com                                        \
                     -d *.example.net                                        \
                     --non-interactive                                       \
                     -m me@example.org                                       \
                     --agree-tos

文件夹certs是三台服务器之间共享的NFS卷。

答案 1 :(得分:0)

尽管大概有人会怀疑您为什么真正想要/需要这个,并且有人会建议您这样做,因为traefik很好地处理了自动重新挑战,这就是acme.json的样子:

{
  "Account": {
    "Email": "acme@example.com",
    "Registration": {
      "body": {
        "status": "valid",
        "contact": [
          "mailto:acme@example.com"
        ]
      },
      "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/12345678"
    },
    "PrivateKey": "ABCD...EFG="
  },
  "Certificates": [
    {
      "Domain": {
        "Main": "example.com",
        "SANs": null
      },
      "Certificate": "ABC...DEF=",
      "Key": "ABC...DEF"
    },
    {
      "Domain": {
        "Main": "anotherexample.com",
        "SANs": null
      },
      "Certificate": "ABC...DEF==",
      "Key": "ABC...DEF=="
    }
  ],
  "HTTPChallenges": {}
}

现在,您可以编写一个导入脚本或模板解析器来遍历您的证书/密钥,并将内容放在方括号中,或者只是以这种格式生成自己的json文件。

请注意,该格式与经典的pem样式(即无换行符)略有不同。

答案 2 :(得分:0)

我只想补充一点,同时我需要使用HAProxy时找到了另一种方法:

  • 仅在HAProxy后面的81端口为acme运行一个traefik
  acl acme path_beg -i /.well-known/acme-challenge/
  use_backend acme if acme
  • 有一个小型网络服务器,提供acme.json(即shell2http)
  • 有一个cronjob(我使用gitlab ci),可以下载acme.json并提取证书(https://raw.githubusercontent.com/containous/traefik/master/contrib/scripts/dumpcerts.sh
  • 将证书附加到traefik.toml模板
  • 构建docker映像并推送到私有注册表
  • 在HAProxy后面的任何后端服务器上,以只读模式在80/443上将此私有traefik实例作为主要traefik运行
  • 编写一个文件监视程序脚本,当acme.json更改并触发dumpcert-script时重新启动所有ro-traefiks