Как удалить сертификат из хранилища Traefik acme при сохранении в consul KV

#traefik #consul

#traefik #consul

Вопрос:

У меня работает Traefik с хранилищем Consul KV. Как мне удалить запись из хранилища сертификатов acme в Consul или принудительно продлить только для одного домена / интерфейса?

Проблема: каким-то образом один из доменов внешнего интерфейса был сохранен с неправильным сертификатом. Он ссылается на сертификат из другого домена (который также является интерфейсом в Traefik).

Я смог проверить acme json, получив значение consul для traefik/acme/account/object ключа, расшифровав и разархивировав его, и это запись из Certs массива:

 {
    "Domains":{
        "Main":"my.domain1.com",
        "SANs":null
    },
    "Certificate":{
        "Domain":"my.domain2.com",
        "CertURL":"https://acme-v02.api.letsencrypt.org/acme/cert/idfordomain2",
        "CertStableURL":"https://acme-v02.api.letsencrypt.org/acme/cert/idfordomain2",
        "PrivateKey":"...",
        "Certificate":"..."
    }
}
  

Как вы можете видеть, каким-то образом сертификат для my.domain2.com был сохранен против записи для my.domain1.com таким образом, это приводит к появлению предупреждения о недопустимом сертификате в браузере. Я хочу очистить всю запись, чтобы Traefik получил новый сертификат. Я использую Consul и сохраняю его в двоичном формате, поэтому я не могу просто отредактировать json.

Ответ №1:

Вот как я решил эту проблему:

Ваша сеть traefik должна быть помечена как attachable: true

Запуск на хосте:

 docker run -it --rm --name consul-client --network traefik_traefik consul sh
  

Затем запустите в созданном контейнере:

 export CONSUL_HTTP_ADDR=consul:8500

# get value from consul and store it to acme.json
consul kv get traefik/acme/account/object | gzip -dc > acme.json

# remove invalid domain and store it to acme-fixed.json
cat acme.json | jq -r 'del (.DomainsCertificate.Certs[] | select(.Domains.Main=="'yourdomain.com'"))' > acme-fixed.json

# gzip it
cat acme-fixed.json | gzip -c > acme-fixed.json.gz

# upload fixed and gzipped json back to consul
consul kv put traefik/acme/account/object @acme-fixed.json.gz
  

Ответ №2:

Самый простой способ — использовать утилиту consul CLI. Утилита также используется для запуска сервера, и в идеале вы должны использовать ту же версию, что и для ваших серверов. Убедитесь, что вы экспортируете переменные среды: CONSUL_HTTP_ADDR — указывает на сервер consul, по умолчанию http://127.0.0.1:8500 и CONSUL_HTTP_TOKEN — токен ACL, если у вас включены ACL на вашем сервере, как и должно быть в производственных средах.

Затем вы просто выполняете следующую команду

 consul kv put traefik/acme/account/object @traefik.json
  

Где trafik.json находится файл json с обновленными значениями, которые вы хотите изменить в хранилище Consul KV.

Или вы можете использовать HTTP API: Consul Create / Update Key

 curl -X PUT --data @traefik.json http://<your-server-url>:<port>/v1/kv/traefik/acme/account/object
  

Если на вашем сервере включен ACL, вам необходимо добавить следующий заголовок к curl запросу, <your-acl-token> который был выдан вам: -H "X-Consul-Token: <your-acl-token>"