Настройка Docker с обратным прокси-сервером Traefik — NET: значение ERR_CERT_AUTHORITY_INVALID для одного домена, несмотря на идентичные настройки и конфиг другого домена, который работает

#docker #nginx #dns #docker-compose #traefik

#docker #nginx #dns #docker-compose #traefik

Вопрос:

У меня есть настройка Docker с Traefik в качестве обратного прокси. У меня есть один контейнер NGINX, обслуживающий статическую страницу. Двух доменов (example-A.com и example-B.de ) должны предоставлять ту же статическую страницу. В то время как example-A.com работает должным образом, как и ожидалось, example-B.de выдает ошибку NET:ERR_CERT_AUTHORITY_INVALID.

example-A.com зарегистрирован в Google domains. Его A-запись с именем «@» указывает на IP-адрес моего хоста Docker.

example-B.de зарегистрирован у другого регистратора домена. Его A-запись указывает на IP-адрес моего хоста Docker (т. Е. идентичный IP-адресу для example-A.com ). Я не могу настроить имя «@» с помощью этого регистратора, я могу установить только запись A и целевой IP.

Мой traefik.toml является:

 defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["admin:xxxxxxxxx"]
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

[api]
entrypoint="dashboard"

[acme]
email = "xxxxxxx@gmail.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

[docker]
domain = "my-main-domain.net"
watch = true
network = "traefik"
  

Мой docker-compose.yml является:

 version: "3"

services:
  my-web:
    image: nginx:alpine
    container_name: my-web
    volumes:
    - /home/my-directory:/usr/share/nginx/html:ro
    networks:
    - traefik
    labels:
    - traefik.enable=true
    - traefik.frontend.rule=Host:example-B.de,example-A.com
    restart: always
  jupyter:
    [config here... with "traefik.frontend.rule=Host:subdomain1.my-main-domain.net"... remainder of config]
  ghost:
    [config here... with "traefik.frontend.rule=Host:subdomain2.my-main-domain.net"... remainder of config]

networks:
  traefik:
    external: true
  

Странное поведение заключается в том, что example-A.com работает должным образом (HTTP и HTTPS), в то время как example-B.de сбой с NET: ERR_CERT_AUTHORITY_INVALID (HTTPS; HTTP перенаправляется на HTTPS, т.Е. та же ошибка), несмотря на точно такую же настройку в docker-compose.yml в том же контейнере на том же хосте Docker (см. traefik.интерфейс.правило) и выполняется под тем же traefik.toml.

Еще одно странное поведение: я получаю выше ошибку NET: ERR_CERT_AUTHORITY_INVALID на моем мобильном телефоне (Chrome). На моем компьютере (Chrome) отображается «страница 404 не найдена» (из Traefik) и «Небезопасно» в строке URL с подробностями «Сертификат TRAEFIK ПО УМОЛЧАНИЮ — Самозаверяющий корневой сертификат — этот сертификат не был подписан третьей стороной».

Две другие службы docker в моем docker-compose.yml (jupyter и ghost) работают, как ожидалось.

Я перезапустил traefik и запустил docker с docker-compose.yml.

Единственное различие, которое я могу заметить, это другой регистратор домена и разница в записях DNS A, как объяснено выше.

Проблема, похоже, связана с SSL, однако, насколько мне (ограниченным) известно, регистратор домена не имеет никакого отношения к сертификатам SSL. Кроме того, настройка DNS, похоже, не является проблемой здесь, поскольку браузер правильно разрешает домен, однако затем показывает ошибку вместо страницы.

Может ли кто-нибудь обнаружить проблему в моих настройках и может указать мне на исправление или как продолжить расследование?

Комментарии:

1. Может ли ваша проблема быть связана с CAA-records ( digitalocean.com/docs/networking/dns/how-to/caa )? В моей настройке у меня была проблема, что letsencrypt не смог выполнить свой вызов на моем HAProxy, потому что не существовало CAA-записи для моего домена для letsencrypt (.com). Мне пришлось создать его вручную в пользовательском интерфейсе моего регистратора домена, и только после этого letsencrypt смог успешно выполнить вызов. Может быть, у регистратора домена, где работает ваш сертификат, есть запись CAA, созданная вручную (позволяющая все), а у того, где она не работает, такая запись не создана автоматически?

2. вау! спасибо @codinghaus ! Это и есть решение. Ты спас мой день!!

Ответ №1:

Как указал @codinghaus в своем комментарии, решение заключается в добавлении записи CAA в домен у регистратора домена. Я добавил тег свойства «проблема» со значением «letsencrypt.org «. Затем я перезапустил traefik, а также мой docker-compose.yml.