Использовать существующие сертификаты LetsEncrypt в Traefik - PullRequest
0 голосов
/ 29 мая 2018

Можно ли использовать существующие сертификаты LetsEncrypt (в формате .pem) в Traefik?

У меня настроен Traefik / Docker для генерации acme.json - могу ли я импортировать существующие сертификаты для набора доменов?

Ответы [ 3 ]

0 голосов
/ 21 июня 2018

В конце концов я нашел правильное решение - не использовать интеграцию Traefik ACME, а вместо этого просто смонтировать сетевой том (EFS), содержащий сертификаты, выданные certbot в ручном режиме.

Почему этот метод был выбран мной?Потому что я монтирую этот том NFS с сертификатом на двух серверах (синий и зеленый).Эти серверы являются живыми и промежуточными серверами для веб-серверов.В любой момент один из них будет «живым», а другой может быть кандидатом на релиз или иным образом в роли «горячего резерва».

По этой причине лучше разделить проблемы и иметь третийСервер работает как выделенный «менеджер сертификатов».Этот сервер t2.nano в основном никогда не будет затронут, и он несет единоличную ответственность за запуск certbot раз в неделю, записывая сертификаты в монтирование NFS, которое совместно используется (в режиме только для чтения) двумя веб-серверами.

Таким образом, Traefik работает как на синем, так и на зеленом серверах, чтобы позаботиться о своей основной задаче проксирования веб-трафика, и просто указывает на файлы сертификатов, выпущенных 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:

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, общий для трех серверов.

0 голосов
/ 14 августа 2019

Я просто хочу добавить, что тем временем я нашел другой подход, в то время как у меня была необходимость использовать HAProxy:

  • запустить один трафик только для acme на порту 81 за HAProxy
  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
  • создание образа докера и отправка в личный реестр
  • запуск этого частного экземпляра traefik в качестве основного traefik на 80/443 в режиме чтения-only mode на любых backend-серверах за HAProxy
  • написать скрипт наблюдателя файла, который перезапускает все ro-traefiks при изменении acme.json и запускает dumpcert-script
0 голосов
/ 21 июня 2018

Несмотря на то, что, вероятно, кто-то задается вопросом, почему вы на самом деле хотите / нуждаетесь в этом, и кто-нибудь посоветует вам против этого, потому что 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 (т.е. без разрывов строки).

...