我让Traefik在Consul KV商店中运行。如何从Consul的acme证书存储中删除记录,或者只为一个域/前端强制续订?
问题: 前端域之一以某种方式保存了错误的证书。它引用了来自其他域的证书(这也是Traefik中的前端)。
我能够通过获取traefik/acme/account/object
键的consul值来检查acme json,对其进行解码和解压缩,这是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。
答案 0 :(得分:2)
这是我解决此问题的方法:
您的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
答案 1 :(得分:0)
最简单的方法是使用Consul CLI实用程序。该实用程序还用于运行服务器,理想情况下,您应使用与服务器所用版本相同的版本。确保导出环境变量:CONSUL_HTTP_ADDR
-指向领事服务器,默认为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>"