一个网站如果不使用 https ,既不能保证数据的安全,又显得很不正规。
letsencrypt 官网提供了一些客户端和各类开发语言实现的 ACMEv2 API。
官方比较推荐 Certbot 客户端还有 acme.sh shell 开发的客户端。
这些客户端通常需要在终端命令行下,进行交互式的调用,完成证书的申请或者续期。
一、本项目使用 go 语言自带的 autocert ,通过配置实现自动的、非交互式的证书自动申请和续期
- 这是一个docker镜像,启动即可自动完成域名证书自动化申请和续期。
- 非常适合自动化部署。
1、只需 1个配置文件
只需要把需要签名的域名填写到 conf/domains.txt 文件中,启动docker就可以完成自动签名和续期的工作。
2、配置文件说明
domains.txt 支持一行单个域名和多个域名,多个域名之间可以用一个或多个空格间隔。
如需定制,可以将config.conf.example 改名为 config.conf,并参考 config.conf.example 的说明进行修改。
配置文件保存在 /conf 路径下,需要把自己的 domains.txt 保存在 /conf 中并挂载到容器上。
签名的结果保存在 /cert-cache 路径下,如需要持久保存,也需要一个路径挂载到容器上。
二、直接使用
docker
docker run -p 80:80 -p 443:443 -v /data/volumes/configable-auto-cert/cert-cache:/cert-cache -v /data/volumes/configable-auto-cert/conf:/conf -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --label description="自动签名续期" --label 启动日期="2025-11-29" -d --name conf-auto-cert configable-auto-cert
三、使用脚本启动
进入含有 cert-cache 和 conf 文件夹的路径,执行下面的脚本。
bash
#!/bin/bash
INSTANCE_NAME="conf-auto-cert"
IMAGE_NAME="configable-auto-cert"
BASE_PATH=$(pwd)
docker run -p 80:80 -p 443:443 -v ${BASE_PATH}/cert-cache:/cert-cache -v ${BASE_PATH}/conf:/conf -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --label description="自动签名续期" --label 启动日期="2025-11-29" -d --name ${INSTANCE_NAME} ${IMAGE_NAME}
四、在域名列表保持不变的情况下,构建包含自己域名数据的docker镜像
把domains.txt保存在当前路径下 conf/ 目录下,
dockerfile
FROM configable-auto-cert:latest
COPY conf /conf
五、构建定制域名的docker镜像
bash
docker build -t my-custom-autocert .
六、启动镜像
bash
docker run -p 80:80 -p 443:443 -v /data/volumes/configable-auto-cert/cert-cache:/cert-cache -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --label description="自动签名续期" --label 启动日期="2025-11-29" -d --name my-cert my-custom-autocert
七、构建自己docker镜像的好处
-
把域名列表保存在git服务器的项目中,修改域名列表,提交到 git上,同时触发jenkins git push 事件,实现docker镜像的重新构建并重新部署。
-
只有域名没有变化,镜像可以长期的重复使用。
八、输出的 /cert-cache 可供 nginx 使用
输出的 /cert-cache 包含每个域名的私钥和公钥,可以直接在启动nginx时进行路径映射。
docker run -d -p 80:80 -p 443:443 --label startDate="2025-11-13" --name somenginx -v /data/volumes/n-nginx/log:/var/log/nginx -v /data/volumes/n-nginx/html:/usr/share/nginx/html -v /etc/localtime:/etc/localtime:ro -v /data/volumes/n-nginx/conf.d:/etc/nginx/conf.d -v /data/volumes/configable-auto-cert/cert-cache:/etc/letsencrypt nginx