Certbot 结合Cloudflare(插件)申请通配符证书
First
Need Know | 需要知道
Certbot
Certbot 是一个由 Electronic Frontier Foundation (EFF) 开发的自动化工具,专门用于帮助网站管理员轻松地获取和管理免费的 SSL/TLS 证书。这些证书通常来自 Let's Encrypt,一个免费的、自动化的证书颁发机构 (CA),使网站能够通过 HTTPS 安全地传输数据。
Certbot 的主要功能包括:
-
自动化证书获取:Certbot 可以自动向 Let's Encrypt 请求 SSL/TLS 证书,而不需要手动处理复杂的命令和流程。
-
自动化续期:Let's Encrypt 的证书默认有效期为 90 天,Certbot 可以自动续期证书,确保网站一直保持有效的 HTTPS 连接。
-
Web 服务器配置:Certbot 可以与流行的 Web 服务器(如 Apache 和 Nginx)集成,自动配置服务器以使用获取的证书。
-
多种验证方式:Certbot 支持多种方式来验证域名所有权,包括 HTTP-01、DNS-01 等。
如果你想让你的网站通过 HTTPS 加密连接,使用 Certbot 是一个方便且免费的选择。
▲ 以上释义来自ChatGPT
通配符证书
通配符证书(Wildcard Certificate)是一种 SSL/TLS 证书,它允许保护一个域名及其所有子域名。通配符证书的主要特点是可以用一个证书来保护无限数量的子域名,而不需要为每个子域名单独获取证书。
通配符证书的域名格式中会包含一个 * 作为通配符,表示可以匹配该位置的任何子域。例如,假设你获取了 *.example.com 的通配符证书,这个证书可以保护以下所有子域名:
www.example.comblog.example.comshop.example.commail.example.com
但它不能保护不同的主域名,比如 example.org 或者其他二级域名(如 sub.shop.example.com,除非通配符出现在第二级子域名的位置)。
使用通配符证书的好处:
- 管理简单:你只需要一个证书就能保护多个子域名,简化了证书管理和续期过程。
- 节约成本:相较于为每个子域名购买单独的证书,通配符证书是一种更经济的选择。
- 灵活性:随着子域名的增加,你不需要再为新子域名获取额外的证书,减少了维护负担。
使用 Let's Encrypt 和 Certbot 也可以获取免费的通配符证书,不过通配符证书必须使用 DNS-01 验证,这需要你能修改 DNS 记录。
▲ 以上释义来自ChatGPT
Need Ready | 需要准备
- Cloudflare Account | Clarefalre 账户
- 域名已接入Cloudflare
Apply | 申请
Create API Tokens | 创建 API 令牌
这里我们使用DNS验证来申请证书
所以我们需要为Certbot申请Cloudflare令牌以此来自动进行DNS验证
▼ 点击以下链接进入API令牌界面并点击申请令牌

▼ 选择模板"编辑区域DNS"

▼ 权限保持默认(编辑)区域资源选择需要申请的域名

▼ TTL来指定此API有效期, Start 保持不动 End自行选择有效期即可

▼ 选择大致如下所示(如若没问题选择创建令牌)

▼ 复制用户 API 令牌
这里需要注意
令牌仅显示一次
请妥善保管

Install Certbot | 安装Certbot
Pkg | 包
我们可以使用相应OS的包管理器来安装certbot和其cloudflare插件
openSUSE
选择需要的包即可

Docker
Certbot提供了非常多的DNS厂商的插件
这里我们选择Cloudflare
▼ 根据以下链接描述
我们需要
- 拉取certbot/dns-cloudflare镜像
- 将上述步骤申请的API存放至cloudflare.ini文件
- 将Host上的cloudflare.ini映射至容器
- 指定cloudflare.ini位置
▼ Docker Shell看起来就是这个样子
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/etc/letsencrypt/cloudflare.ini:/.secrets/certbot/cloudflare.ini"
certbot/dns-cloudflare certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /.secrets/certbot/cloudflare.ini \
-d example.com
▲ 以上Shell指定了如下内容 ▼
- 映射Host下/etc/letsencrypt/cloudflare.ini至/.secrets/certbot/cloudflare.ini
- 设定了环境变量--dns-cloudflare和--dns-cloudflare-credentials
▼ 但这样还不够我们还需要一些杂项比如
- 使用--key-type ecdsa 指定证书类型为ecdsa
- 使用--agree-tos 来同意服务条款
- 使用-m 来指定Email
▼ 所以最终版Docker Shell看起来大概是这样
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/etc/letsencrypt/cloudflare.ini:/.secrets/certbot/cloudflare.ini"
certbot/dns-cloudflare certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /.secrets/certbot/cloudflare.ini \
--key-type ecdsa \
--agree-tos \
-m [email protected]
-d example.com
Podman(Quadlet)
贴一下Quadlet的配置

[Unit]
Description=using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS
After=network-online.target
Wants=network-online.target
Before=shutdown.target
[Container]
AutoUpdate=registry
ContainerName=certbot
Image=docker.io/certbot/dns-cloudflare
Volume=/etc/letsencrypt:/etc/letsencrypt
Volume=/var/lib/letsencrypt:/var/lib/letsencrypt
Volume=/etc/letsencrypt/cloudflare.ini:/.secrets/certbot/cloudflare.ini
Exec=certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /.secrets/certbot/cloudflare.ini \
--key-type ecdsa \
--agree-tos \
-m [email protected] \
-d '*.xzllll.com'
Config | 配置
证书申请完成后会被放置在自身指定的文件夹
▼ 文件树如下所示

其中
- archive 证书文件存档
- live 生成的证书文件(软链接至archive)
- renewal 存放更新证书时所需的文件
我们只需到Live文件夹下根据所需配置证书文件即可
▼ 例如Haproxy
cat fullchain.pem > /etc/haproxy/example.com.pem && cat privkey.pem >> /etc/haproxy/example.com.pem
Renew | 更新证书
因为有了renewal文件夹的存在
Certbot 会在证书更新时读取renewal文件夹的内容来自动更新证书
所以只需执行renew选项即可
▼ Shell
certbot renew
▼ Docker
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/etc/letsencrypt/cloudflare.ini:/.secrets/certbot/cloudflare.ini"
certbot/dns-cloudflare renew
▼ Podman(Quadlet)
[Unit]
Description=using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS
After=network-online.target
Wants=network-online.target
Before=shutdown.target
[Container]
AutoUpdate=registry
ContainerName=certbot
Image=docker.io/certbot/dns-cloudflare
Volume=/etc/letsencrypt:/etc/letsencrypt
Volume=/var/lib/letsencrypt:/var/lib/letsencrypt
Volume=/etc/letsencrypt/cloudflare.ini:/.secrets/certbot/cloudflare.ini
Exec=renew