使用Docker生成LetsEncrypt证书

起因

自从Blog启用SSL证书以来,一直用LetsEncrypt家的免费SSL证书。最近,因为配置一些新的域名,免不了要继续申请LetsEncrypt的新证书。之前申请证书的方法,都是手动git clone在GitHub上的那个certbot项目,然后运行命令。这种方式唯一的不足,是certbot本身需要用到python环境,每次申请证书还会更新一些本机的环境,如果遇到了Linux的包冲突,还得先解决冲突才行。

解决办法

基于这样的困扰,哥想到了能不能用Docker来实现证书的申请?毕竟使用Docker的初衷,就是解决和隔离环境上的差异。结果google了一下,还真找到了这样的骚操作,顺便修改了一下脚本,实现了在Docker中运行certbot来申请证书的目的。由于是在Docker中运行,不用担心不同的服务器环境带来的差异,只需要把LetsEncrypt的目录映射到宿主机上即可。这样,新申请到的SSL证书能直接写入到宿主机的对应位置。基于Docker运行certbot,还能够做到即用即抛,每次运行申请SSL证书的容器,用完生成证书后,容器随即删掉,相当的方便。

封装了一个简单的脚本,在容器中申请证书的姿势大致如下:

1
2
3
4
5
6
7
8
9
#!/bin/bash
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/data/letsencrypt:/.secrets" \
-p 80:80 \
-p 443:443 \
certbot/dns-cloudflare certonly \
-d $1

其中的 -v参数,将LetsEncrypt的目录跟宿主机关联起来,这样,每次生成的证书会保存在宿主机对应位置/etc/letsencrypt/中。
-p端口的映射,是为了在生成证书的时候,让certbot可以验证端口。
--rm参数,是为了达到用完即删除容器的效果,容器运行一次后,自从删除。

运行示例:

1
./cert.sh example.com

创建的脚本大致如此,非常简单,用起来也非常爽。其实,SSL证书renew的时候,也可以这么干。

我把创建和renew证书的脚本,都放在了gist上,供有需要的同学参考。

支持原创技术分享,据说打赏我的人,都找到了女朋友!