By Myself

Certbot 结合Cloudflare(插件)申请通配符证书

实践 | Practices 2024年9月19日

First

Need Know | 需要知道

Certbot

Certbot 是一个由 Electronic Frontier Foundation (EFF) 开发的自动化工具,专门用于帮助网站管理员轻松地获取和管理免费的 SSL/TLS 证书。这些证书通常来自 Let's Encrypt,一个免费的、自动化的证书颁发机构 (CA),使网站能够通过 HTTPS 安全地传输数据。

Certbot 的主要功能包括:

  1. 自动化证书获取:Certbot 可以自动向 Let's Encrypt 请求 SSL/TLS 证书,而不需要手动处理复杂的命令和流程。

  2. 自动化续期:Let's Encrypt 的证书默认有效期为 90 天,Certbot 可以自动续期证书,确保网站一直保持有效的 HTTPS 连接。

  3. Web 服务器配置:Certbot 可以与流行的 Web 服务器(如 Apache 和 Nginx)集成,自动配置服务器以使用获取的证书。

  4. 多种验证方式:Certbot 支持多种方式来验证域名所有权,包括 HTTP-01、DNS-01 等。

如果你想让你的网站通过 HTTPS 加密连接,使用 Certbot 是一个方便且免费的选择。

▲ 以上释义来自ChatGPT

通配符证书

通配符证书(Wildcard Certificate)是一种 SSL/TLS 证书,它允许保护一个域名及其所有子域名。通配符证书的主要特点是可以用一个证书来保护无限数量的子域名,而不需要为每个子域名单独获取证书。

通配符证书的域名格式中会包含一个 * 作为通配符,表示可以匹配该位置的任何子域。例如,假设你获取了 *.example.com 的通配符证书,这个证书可以保护以下所有子域名:

  • www.example.com
  • blog.example.com
  • shop.example.com
  • mail.example.com

但它不能保护不同的主域名,比如 example.org 或者其他二级域名(如 sub.shop.example.com,除非通配符出现在第二级子域名的位置)。

使用通配符证书的好处:

  1. 管理简单:你只需要一个证书就能保护多个子域名,简化了证书管理和续期过程。
  2. 节约成本:相较于为每个子域名购买单独的证书,通配符证书是一种更经济的选择。
  3. 灵活性:随着子域名的增加,你不需要再为新子域名获取额外的证书,减少了维护负担。

使用 Let's Encrypt 和 Certbot 也可以获取免费的通配符证书,不过通配符证书必须使用 DNS-01 验证,这需要你能修改 DNS 记录。

▲ 以上释义来自ChatGPT

Need Ready | 需要准备

  • Cloudflare Account | Clarefalre 账户
  • 域名已接入Cloudflare

Apply | 申请

Create API Tokens | 创建 API 令牌

这里我们使用DNS验证来申请证书

所以我们需要为Certbot申请Cloudflare令牌以此来自动进行DNS验证

▼ 点击以下链接进入API令牌界面并点击申请令牌

https://dash.cloudflare.com/profile/api-tokens

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

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

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

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

▼ 复制用户 API 令牌

这里需要注意

令牌仅显示一次

请妥善保管

Install Certbot | 安装Certbot

Pkg | 包

我们可以使用相应OS的包管理器来安装certbot和其cloudflare插件

openSUSE

选择需要的包即可

Docker

Certbot提供了非常多的DNS厂商的插件

这里我们选择Cloudflare

▼ 根据以下链接描述

https://certbot-dns-cloudflare.readthedocs.io/en/stable/

我们需要

  • 拉取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

标签

xzllll

三分钟热度三分钟收获