#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>"