存储traefik让加密证书不是json

时间:2017-11-10 08:31:32

标签: ssl-certificate lets-encrypt traefik

您知道traefik能够为您的网络服务完成所有Let的加密(请求和续订)。但是traefik将所请求的证书存储为JSON文件,这不是证书的通用格式。

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

我的问题:traefik是否有可能以通用格式存储Let的加密证书?

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

我正在使用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


特雷菲克与领事担任KV店

导出包含证书和私钥的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

备份领事

备份

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

还原

cat -s backup-base64 | base64 --decode | consul kv put traefik/acme/account/object -

答案 1 :(得分:1)

免责声明:我是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)

答案 2 :(得分:1)

我迟到了,但是与此同时,有一些docker化解决方案可以为您提取证书并观看acme.json文件中的更改,例如https://github.com/SnowMB/traefik-certificate-extractor(与我没有任何关系)。

答案 3 :(得分:0)

最受欢迎的解决方案是ldez/traefik-certs-dumper。如果是docker-compose,则需要遵循以下几行内容:

version: '3'

services:
    traefik:
        image: traefik:1.7
        command:
            --entryPoints='Name:http Address::80'
            --entryPoints='Name:https Address::443 TLS'
            --defaultentrypoints=http,https
            --logLevel=DEBUG
            --docker
            --docker.exposedByDefault=false
            --acme
            --acme.acmeLogging=true
            --acme.entrypoint=https
            --acme.storage=/data/acme.json
            --acme.onHostRule=true
            --acme.httpChallenge.entryPoint=http
        ports:
            - 8001:80
            - 8002:443
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - .:/data

    traefik-certs-dumper:
        image: ldez/traefik-certs-dumper:v2.7.0
        entrypoint: sh -c '
            apk add jq
            ; while ! [ -e /data/acme.json ]
                || ! [ `jq ".Certificates | length" /data/acme.json` != 0 ]; do
                    sleep 1
                ; done
            && traefik-certs-dumper file --watch 
                --source /data/acme.json --dest /data/certs'
        volumes:
            - .:/data

    # test service
    whoami:
        image: containous/whoami
        labels:
            traefik.enable: true
            traefik.frontend.rule: Host:example.com

traefik端口被发布到80018002。我在这里假设您需要将证书作为单独的文件,因为您要将traefik放在另一个代理后面。

more