Bee*_*per 3 ssl-certificate lets-encrypt traefik
你知道 traefik 能够为你的网络服务做所有让我们加密的东西(请求和更新)。但是 traefik 将请求的证书存储为 JSON 文件,这不是证书的通用格式。
我想对我的邮件服务器也使用 Let's Encrypt 证书,所以我需要它们的简单格式:*.pem 或 *.crt。
我的问题是:traefik 是否有可能以通用格式存储 Let's Encrypt 证书?
感谢帮助!
我jq用来做这个
出口证明
cat acme.json | jq -r '.Certificates[] | select(.Domain.Main=="'www.example.com'") | .Certificate' | base64 -d > www.example.com.crt
Run Code Online (Sandbox Code Playgroud)
导出私钥
cat acme.json | jq -r '.Certificates[] | select(.Domain.Main=="'www.example.com'") | .Key' | base64 -d > www.example.com.key
Run Code Online (Sandbox Code Playgroud)
导出包含证书和私钥的 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
Run Code Online (Sandbox Code Playgroud)
仅出口证书
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
Run Code Online (Sandbox Code Playgroud)
仅导出私钥
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
Run Code Online (Sandbox Code Playgroud)
备份
consul kv get -base64 traefik/acme/account/object > backup-base64
Run Code Online (Sandbox Code Playgroud)
恢复
cat -s backup-base64 | base64 --decode | consul kv put traefik/acme/account/object -
Run Code Online (Sandbox Code Playgroud)
免责声明:我是 Traefik 的新手,所以可能有比我不知道的更好的解决方案。
我所做的是使用JayH5 的 Python 脚本从 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']))
Run Code Online (Sandbox Code Playgroud)
根据您的用例,您可以跳过保存文件并使用该代码直接从 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4210 次 |
| 最近记录: |