docker部署certbot申请Let’s Encrypt证书
最近想给域名申请一个免费的证书,经过查询找到了Let's Encrypt,并且可以使用certbot来申请,因为一直在使用docker,所以就想着看是否可以使用docker来进行证书的申请,于是就开启了此次的折腾之路:使用docker部署certbot申请Let's Encrypt证书。
安装certbot
certbot的安装方式有很多种,官方也有一些系统的安装文档,可以根据官方的安装文档来直接安装到对应的操作系统上:installation,非常详细。官方推荐的方式是通过snap
的形式来安装,另外还有docker
、pip
、第三放发行版本
以及certbot-auto(官方已经标示为过期)
。
申请形式
申请证书的形式也有很多:
其中一些方式要配合开启80和443端口来实现,还需要进行域名解析,我这里就选择使用DNS Plugins
的形式来进行申请,因为域名在cloudflare,所以就使用certbot-dns-cloudflare
插件来进行申请,文档地址:Welcome to certbot-dns-cloudflare’s documentation!。
申请准备
docker文件的目录如下:
├── certs //存放证书
├── conf
│ ├── cloudflare.ini //配置文件
├── logs //日志
└── docker-compose.yml //docker-compse文件
└── .env //环境变量信息
certs
目录是映射到docker容器中的,存放证书文件。
cloudflare.ini
该要存放cloudflare的api token,这里使用的是自己创建的token,配置文件内容如下:
dns_cloudflare_api_token = your_cloudflare_api_key
具体的生成方式看下图:
选择创建令牌:
区域中选择DNS给一个编辑权限,然后就是区域字段选择自己的域名,我这里是给每个域名单独的token,所以需要选择一个域名,可以根据自己需求选择。
logs
logs中是存在certbot执行日志的地方。
docker-compose.yaml
docker-compose.yaml文件内容如下:
version: "3"
services:
certbot:
image: certbot/dns-cloudflare:v2.4.0
container_name: certbot
env_file:
- .env
volumes:
- ./certs:/etc/letsencrypt
- ./logs:/var/log/letsencrypt
- ./conf/cloudflare.ini:/secrets/cloudflare.ini
# dry run
# command: certonly --dns-cloudflare --agree-tos --non-interactive --dns-cloudflare-credentials /secrets/cloudflare.ini --email ${CERTBOT_EMAIL} --dns-cloudflare-propagation-seconds 20 -d ${CERTBOT_DOMAIN} --dry-run
# issue --force-renewal
command: certonly --dns-cloudflare --agree-tos --non-interactive --dns-cloudflare-credentials /secrets/cloudflare.ini --email ${CERTBOT_EMAIL} --dns-cloudflare-propagation-seconds 20 -d ${CERTBOT_DOMAIN}
# renew
# command: renew --dns-cloudflare --no-self-upgrade --agree-tos --non-interactive --dns-cloudflare-credentials /secrets/cloudflare.ini --dns-cloudflare-propagation-seconds 20
使用.env配置文件,然后把certbot中的/etc/letsencrypt目录映射到容器外部的certs目录,另外就是日志以及cloudflare的配置文件。
执行的命令有三个,dry-run是测试申请功能是否正常,如果正常则使用issue的命令进行正常申请,因为申请的证书只有三个月的有效期,所以需要进行续期,续期使用renew的命令。
--agree-tos 同意tos(term of service)
--non-interactive 非交互式的
--dns-cloudflare-credentials 指定cloudflare的token文件位置
--eamil 邮箱
--dns-cloudfalre-propagation-seconds 等待时间
-d 指定需要申请证书的域名,如果有多个域名则指定多个-d参数。如果需要申请泛域名证书,则使用*.xxx.com,生成的证书会在xxx.com目录下。
.env
env文件是一些配置信息,如上边的docker-compose.yaml文件中有两个动态的参数,一个是邮箱,另一个是申请证书的域名,我们就是在.env文件中指定的,内容如下:
CERTBOT_DOMAIN=your_domain_name
CERTBOT_EMAIL=your_email
指定邮箱和域名就可以了。
申请
经过上边的文件准备,接下来就可以开始申请了,使用docker compose up 来进行申请。申请后的证书就在certs目录下。
├── 1.txt
├── accounts
├── archive
├── live
├── renewal
├── renewal-hooks
└── ssl
证书文件在live下。然后我们就可以在nginx中使用我们申请的证书文件了。
续期
证书三个月的有效期,在快要过期的时候需要进行续期,续期则使用docker-compose.yaml文件中的续期命令就可以了。大家也可以做一个corn定时任务来进行定期续期。
最后祝大家申请顺利。