保存到领事KV时如何从Traefik acme存储中删除证书

时间:2019-04-12 06:16:29

标签: traefik consul

我让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。

2 个答案:

答案 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:8500CONSUL_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>"