【问题标题】:Store traefik let's encrypt certificates not as json存储 traefik 让我们加密证书而不是 json
【发布时间】:2018-04-23 10:21:46
【问题描述】:

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

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

这是我的问题:traefik 是否有可能以通用格式存储 Let's Encrypt 证书?

感谢您的帮助!

【问题讨论】:

    标签: ssl-certificate lets-encrypt traefik


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 总是有一个明显的答案:)
        【解决方案4】:

        最流行的解决方案是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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-20
          • 1970-01-01
          • 2017-09-08
          • 1970-01-01
          • 2016-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多