存储traefik让我们加密证书而不是json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储traefik让我们加密证书而不是json相关的知识,希望对你有一定的参考价值。

你知道traefik能够为你的webservices做所有Let's Encrypt的东西(请求和更新)。但是traefik将请求的证书存储为JSON文件,这不是证书的通用格式。

我也想为我的邮件服务器使用Let的加密证书,所以我需要它们的简单格式:* .pem或* .crt。

在这里我的问题:traefik有可能以通用格式存储Let的加密证书吗?

感谢帮助!

答案

我正在使用jq来做到这一点

出口证明

cat acme.json | jq -r '.Certificates[] | select(.Domain.Main=="'www.example.com'") | .Certificate' | base64 -d > www.example.com.crt

导出私钥

cat acme.json | jq -r '.Certificates[] | select(.Domain.Main=="'www.example.com'") | .Key' | base64 -d > www.example.com.key

Traefik with Consul as KV store

导出包含证书和私钥的JSON

consul kv get traefik/acme/account/object | gzip -dc | jq -r '.DomainsCertificate.Certs[] | select(.Domains.Main=="'www.example.com'") | .Certificate' > www.example.com.json

仅出口证明

consul kv get traefik/acme/account/object | gzip -dc | jq -r '.DomainsCertificate.Certs[] | select(.Domains.Main=="'www.example.com'") | .Certificate.Certificate' | base64 -D >  www.example.com.crt

仅导出私钥

consul kv get traefik/acme/account/object | gzip -dc | jq -r '.DomainsCertificate.Certs[] | select(.Domains.Main=="'www.example.com'") | .Certificate.PrivateKey' | base64 -D > www.example.com.key

backup Consul

备用

consul kv get -base64 traefik/acme/account/object > backup-base64

恢复

cat -s backup-base64 | base64 --decode | consul kv put traefik/acme/account/object -
另一答案

免责声明:我是Traefik的新手,所以可能有一个比我更清楚的解决方案。

我所做的是使用a Python script by JayH5从acme.json文件中提取密钥文件。

def read_domain_certs(acme_json_path, domain):
    with open(acme_json_path) as acme_json_file:
        acme_json = json.load(acme_json_file)

    certs_json = acme_json['DomainsCertificate']['Certs']
    domain_certs = [cert['Certificate'] for cert in certs_json
                    if cert['Domains']['Main'] == domain]

    if not domain_certs:
        raise RuntimeError(
            'Unable to find certificate for domain "%s"' % (domain,))
    elif len(domain_certs) > 1:
        raise RuntimeError(
            'More than one (%d) certificates for domain "%s"' % (domain,))

    [domain_cert] = domain_certs
    return (base64.b64decode(domain_cert['PrivateKey']),
            base64.b64decode(domain_cert['Certificate']))

根据您的使用情况,您可以跳过保存文件并使用该代码直接从JSON文件加载密钥。但是,如果确实需要PEM文件,则脚本还会写入密钥内容(如果需要磁盘上的文件)。

def write_cert(storage_dir, filename, cert_content):
    cert_path = os.path.join(storage_dir, filename)
    with open(cert_path, 'w') as cert_file:
        cert_file.write(cert_content)
    os.chmod(cert_path, 0o600)
另一答案

我迟到了,但同时有一些码头化的解决方案会为你提取证书并观看acme.json文件的变化,例如https://github.com/SnowMB/traefik-certificate-extractor(我不以任何方式加入它)。

以上是关于存储traefik让我们加密证书而不是json的主要内容,如果未能解决你的问题,请参考以下文章

markdown 使用Traefik设置Let的加密证书

traefik 配置自动申请ssl免费证书

开源反向代理 Traefik 暴露用户的 TLS 证书密钥

Let's Encrypt证书安装

让我们加密发布假证书的 kubernetes 入口控制器

让我们加密证书、Python 和 Windows