Traefik + SSL Let's Encrypt DNS challenge + домен Reg.ru + серый динамический IP

Возник вопрос по работе в Traefik с SSL сертификатами к домену от reg.ru при сером динамическом IP. Задача - ходить внутри сети по доменным именам с сертами. Находясь вне дома окажусь внутри через Netbird, этого достаточно.
Ранее стоял Nginx Proxy Manager, серты получал скриптом с помощью certbot и плагином для работы с reg.ru (по DNS Challenge, в качестве IP указывал в ЛК внутренний адрес NPM), потом подкладывал ручками в NPM.

Т.к. предыдущий инстанс хоумлабы помер (он был полутестовый), решил в новом перейти на Traefik (установлен в LXC по методичке Stilicho) и пока не получается наладить работу с сертами. Вижу, что Traefik работает с провайдерами, доступными Lego for ACME и там есть reg.ru в списке доступных DNS Providers (тыц). Однако наладить получение серта так и не получилось, и не разобрался как подкладывать Traefik’у полученные скриптом серты. Вроде известный продавец доменов, а инфы толком нет, не нашёл кейсов кто и как делал. В идеале автоматизировать бы получение и обновление сертов через DNS Challenge.

Может кто-то уже проходил такой путь с reg.ru и поделится, что и где нужно прописывать / настраивать?

Если не получается настроить, то какие ошибки вылазят или на каком моменте затык?

Согласно документации

1. Получение самим traefik

certificatesResolvers:
  regru:
    acme:
      storage: /etc/traefik/acme/acme.json
      dnsChallenge:
        provider: regru
        delayBeforeCheck: 5
        resolvers:
          - 1.1.1.1:53
          - 8.8.8.8:53

Ну и передать переменные окружения

REGRU_PASSWORD	API password
REGRU_USERNAME	

resolvers может удалить или прописать яндека, я для cloudflare прописывал это, иначе проверка не срабатывала

2. Подсунуть существующие серты (в файловом конфиге)


---
tls:
  certificates:
    - certFile: /secrets/certs/domain1.ru.crt
      keyFile: /secrets/certs/domain1.ru.key
      stores:
        - default
    - certFile: /secrets/certs/domain2.ru.crt
      keyFile: /secrets/certs/domain2.ru.key

P.S.
reg.ru не настраивал, но там все стандартно

Спасибо! Сейчас приведу конфиги и ошибки.

Вот такой статический конфиг (/etc/traefik/traefik.yaml):

global:
  checkNewVersion: true # traefik стоит 3.5.2
  sendAnonymousUsage: false
# Enable traefik ui dashboard
api:
  dashboard: true
  insecure: true # false   # access to http://traefikIP:8080/dashboard/ is disabled
  debug: true
  disableDashboardAd: false # true
entryPoints:
  web:
    address: ":80"
    http:
      redirections: 
        entryPoint:
            to: websecure
            scheme: https
  websecure:
    address: ":443"
serversTransport:
    insecureSkipVerify: true
providers:
  file:
    directory: /etc/traefik/dynamic
    watch: true
    #filename: /etc/traefik/config.yaml # when a specific file is desired
#-https://doc.traefik.io/traefik/https/acme/
certificatesResolvers:
  regru:
    acme:
      storage: /etc/traefik/acme.json
      dnsChallenge:
        provider: regru
        delayBeforeCheck: 5 # пробовал разные варианты, например 60
#        resolvers: # пробовал добавлять и разные комбинации, не помогло
#          - 77.88.8.8:53
#          - 77.88.8.1:53
#          - 1.1.1.1:53
#          - 8.8.8.8:53

Вот динамический конфиг (/etc/traefik/dynamic/config.yaml):

http:
# https://doc.traefik.io/traefik/routing/routers/
  routers:
   # harden dashboard access: can only be accessed with a username/password
    dashboard:
      entryPoints:
        - websecure 
      rule: "Host(`traefik-dashboard.mydomain.ru`)"
      service: api@internal
      middlewares:
        - auth
      tls:
        certResolver: regru
  middlewares:
# Middleware for Redirection
# This can be used instead of global redirection
#
    auth:
      basicAuth:
        users:    # users and their MD5 hashed passwords, granted access to the traefik dashboard 
          - "admin:hashedpassword" # openssl passwd -1 "hashedpassword"
#
    https-redirect:
      redirectScheme:
        scheme: https
        permanent: true
#
    default-headers:
      headers:
        frameDeny: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15552000
        customFrameOptionsValue: SAMEORIGIN
        customRequestHeaders:
          X-Forwarded-Proto: https
tls:
  options:
    default:
      minVersion: VersionTLS12    # change to a lower version if you expect to service Internet traffic from around the world
      curvePreferences:   # below priority sequence can be changed
        - X25519     # the most commonly used 128-bit
        - CurveP256  # the next most commonly used 128-bit
        - CurveP384  # 192-bit
        - CurveP521  # 256-bit
      sniStrict: true     # true if our own certificates should be enforced
      cipherSuites:
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
        - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  stores:
    default:
      defaultGeneratedCert:
        resolver: regru
        domain:
          main: mydomain.ru
          sans:
            - "*.mydomain.ru"

Вот что происходит в консоли:

root@traefik:~# export REGRU_USERNAME="myemail@mailprovider.ru"

root@traefik:~# export REGRU_PASSWORD="mypassword"

root@traefik:~# traefik

2025-09-22T10:46:34+03:00 ERR Error while creating certificate store error="unable to find certificate for domains \"*.mydomain.ru,mydomain.ru\": falling back to the internal generated certificate" tlsStoreName=default

2025-09-22T10:46:34+03:00 ERR Error while creating certificate store error="unable to find certificate for domains \"*.mydomain.ru,mydomain.ru\": falling back to the internal generated certificate" tlsStoreName=default

2025-09-22T10:49:10+03:00 ERR Unable to obtain ACME certificate for domain error="unable to generate a certificate for the domains [mydomain.ru *.mydomain.ru]: error: one or more domains had a problem:\n[*.mydomain.ru] propagation: time limit exceeded: last error: authoritative nameservers: NS ns2.reg.ru.:53 did not return the expected TXT record [fqdn: _acme-challenge.mydomain.ru., value: <somevalue>]: <somevalue>\n[mydomain.ru] propagation: time limit exceeded: last error: authoritative nameservers: NS ns2.reg.ru.:53 did not return the expected TXT record [fqdn: _acme-challenge.mydomain.ru., value: <somevalue>]: qerGznFtt5HHne0aIXTmIdF6lYeCXCKzq4wJcXvSif8\n" ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory domains=["mydomain.ru","*.mydomain.ru"] providerName=regru.acme tlsStoreName=default

Было бы круто всё таки наладить выпуск сами Traefik’ом. Есть мысли, что поправить нужно?

1 лайк

судя по логам DNS сервер reg.ru не отдает нужную TXT запись, посмотрите в админке домена,

  • если запись там есть, то проблема с кешированием,
  • если записи нет, то проблема с api reg.ru

в качестве альтернативного варианта я активно использую acme-dns. Суть в том, что это отдельный DNS сервер, при регистрации вы получаете файл с кредами от него, а потом надо руками 1 раз прописать CNAME записи в своей админке, которые будут вести на этот acme-dns DNS сервер

                     +-------------------+
                     |    Let's Encrypt  |
                     |   ACME-сервер CA  |
                     +---------^---------+
                               |
                               | проверка DNS-01 challenge
                               |
                     +---------v---------+
                     |     acme-dns      |
                     |   (под управлением|
                     |     пользователя) |
                     +---------^---------+
                               |
                               | CNAME-запросы
                               |
   +-------------------+       |       
   |     DNS Reg.ru    |-------+
   | (основная зона)   |       ^
   | _acme-challenge   |       |
   | CNAME -> acme-dns |       |
   +-------------------+       |
                               |
                               |
             +-----------------+-----------------+
             |                                     |
   +---------v---------+                 +---------v---------+
   |     Certbot       |                 |  Конфигурируемый  |
   | (у пользователя)  |                 |   web/mail/etc.   |
   +-------------------+                 |     сервер        |
             |                           +-------------------+
             | API-запросы
             v
       (автоматическая
         запись token
       в acme-dns)
3 лайка

вчера смотрел список поддерживаемых провайдеров и что-то этого не видел
откуда вы берете этих провайдеров?

делал кто-то поддержу своего провайдера?

DNS Providers :: Let’s Encrypt client and ACME library written in Go. вот тут список провайдеров

В lego не делал, для certbot писал свой скрипт для yandex cloud, он брал системный аккаунт виртуалки и с ним обновлял DNS зону

Ну и в случае отсутствия провайдера всегда можно воспользоваться acme-dns, у меня корпоративный развернут для дополнительной безопасности. Дома пользовал публичный.

Резюмирую по своему опыту с reg.ru, Traefik и SSL.

  1. Выпускать сертификаты напрямую из Traefik не вышло (описано выше, скорее всего кэширование - записи появлялась на reg.ru)
  2. При установке Traefik в LXC не получилось и использовать имеющиеся сертификаты (которые получал скриптом certbot + плагин для reg.ru): или явные ошибки ловил, или не подтягивались серты в Traefik. Возможно, что-то не понял.
  3. acme-dns не пробовал
  4. При установке Traefik в Docker имеющиеся сертификаты получилось прокинуть без проблем, хотя конфиги ± те же. Заработало.
  5. При установке Traefik в Docker пробовать наладить автоматическое получение сертификатов к домену reg.ru самим уже не стал, остановился на варианте 4.

Пока кажется, что работать с Traefik проще когда он в Docker.

1 лайк

а можеш в кратце написать, как это работает? лист посмотрел, своего хостера не нашел, хотя они пишут, что их апи как у powerdns

так что я попробую powerdns провайдера для начала, потом через костыль этот

Вот тут описывал. 1 раз для домена надо прописать cname записи в своем основном домене, а потом certbot уже работает через API с acme-dns сервером. т.е. можно подцепить к любому DNS провайдеру.

Из минусов невозможность привязки нескольких аккаунтов к одному домену, но я решал тем, что копировал acme-dns.json на другие сервера

ааа :face_with_bags_under_eyes:
я думал бот через апи как-то сам создает поддомены и записи тхт или чего там ему надо

хотелось бы просто трафику домен добавить и чтобы само дальше

Попробуйте увеличить delayBeforeChecks.
У меня с такими настройками в докере сертификаты поттягиваются:

certificatesResolvers:
  regru-dns:
    acme:
      email: user@mail.ru
      storage: /etc/traefik/acme/acme.json
      dnsChallenge:
        provider: regru
        propagation:
          delayBeforeChecks: 300
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"
2 лайка