本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html
本文做者: 苏洋git
统计字数: 2655字 阅读时间: 6分钟阅读 本文连接: soulteary.com/2018/08/30/…github
Let‘s Encrypt
在好久以前就开始了证书的免费申请,可是随着 API 的升级、功能的增长,以前使用acme.sh
脚本就可以轻松获取证书的操做,变得愈来愈麻烦,并且随着配置项愈来愈多,浏览文档很难快速了解到什么才是当前的最佳实践。golang
在更新服务器操做系统以后,本来一直使用的 acme.sh
出现了问题:读取不到我配置的 DNS 帐户名称,无论我是否直接将帐号写入了执行脚本中。考虑到将来这套证书获取客户端还存在升级的状况,继续修改它显然不是一个理智的选择。算法
虽然我使用的 Traefik 支持自动申请证书,可是一来我但愿有更多的配置项,好比加密方案的选择、好比证书单独保存以备复用。docker
二来在查看官方文档以后,发现官方推荐了一套名为 certbot
的客户端,并提供了 Docker
镜像,官方文档。编程
在翻阅文档以后,咱们发现客户端使用很简单,只须要2条命令,几个输入确认就能够了。看起来还不错,那么试试看吧。api
为了保证解耦,我的使用无侵入的 DNS 模式,其实使用网站根目录放置验证文件也是同样的。bash
官方提供了十几种主流的 DNS 服务商的镜像,还提供了示例支持你本身进行封装。服务器
这里我选择的是 cloudflare
这家服务商,因此对应的镜像是 certbot/dns-cloudflare
,你能够酌情修改。
由于使用 DNS 模式,须要提供 DNS 的验证文件(包含邮箱和私钥),因此这里须要先建立一个验证文件。
mkdir -p /data/letsencrypt/
touch /data/letsencrypt/cloudflare.ini
复制代码
而后在 cloudflare.ini
中写入你的数据,好比:
# Cloudflare API credentials used by Certbot
dns_cloudflare_email = example@example.com
dns_cloudflare_api_key = e89af204ab0e06def9c0846c202d1dec40e80
复制代码
以后使用 Docker 的一次性执行模式启动一个客户端容器便可:
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/data/letsencrypt:/.secrets" \
certbot/dns-cloudflare certonly \
--dns-cloudflare-credentials /.secrets/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d soulteary.com -d '*.soulteary.com'
复制代码
若是你不须要签通配符证书的话,那么能够去掉 --server https://acme-v02.api.letsencrypt.org/directory
参数,另外,若是你的域名生效时间很长,能够考虑适当调大 --dns-cloudflare-propagation-seconds 60
中的等待时间(单位秒)。
执行脚本以后,会问你几个简单的问题,依次是选择申请证书的验证方式(DNS记录、临时验证Web服务、网站根目录的静态文件),用户协议是否赞成,询问你的邮箱,并分享给基金会,若是你没有使用 -d
参数声明要签的网站域名还会询问你网站域名是什么。
若是一切顺利,你的证书公钥私钥等文件将会一家人整整齐齐的摆放在咱们映射好的目录:
/etc/letsencrypt/live
复制代码
经过查看文件目录,能够得知,这里存放的是最新申请到的证书的软链。
lrwxrwxrwx 1 root root 37 Aug 30 12:49 cert.pem -> ../../archive/soulteary.com/cert1.pem
lrwxrwxrwx 1 root root 38 Aug 30 12:49 chain.pem -> ../../archive/soulteary.com/chain1.pem
lrwxrwxrwx 1 root root 42 Aug 30 12:49 fullchain.pem -> ../../archive/soulteary.com/fullchain1.pem
lrwxrwxrwx 1 root root 40 Aug 30 12:49 privkey.pem -> ../../archive/soulteary.com/privkey1.pem
复制代码
因此你大可没必要担忧你更新证书失败,连回滚的机会都没有的状况。
至于如何更新、续签证书呢,答案也很简单,上面那段 docker run
申请命令,从新运行一遍便可,在输入了域名以后,选择 [renew]
便可。
固然,客户端也提供了免交互的方案,把 docker run
镜像后的参数修改成 renew
便可一次性续签全部证书。
其实也没有太大必要去调整加密算法,除非你要刻意兼容特别老的设备,使用默认配置便可。
加上 Traefik ,或者应该说 golang 已经支持了 CHACHA20_POLY1305
(文档),签出来的证书,直接挂载到 Traefik 便可支持当前主流的全部设备。
详见下面的证书测试报告:
--EOF
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核) 关于折腾群入群的那些事