在阿里云(Aliyun)上实现 Certbot 自动化申请(特别是申请泛域名 证书,如 *.example.com),必须使用 DNS-01 验证。
由于 Certbot 官方并未内置阿里云插件,我们需要安装一个第三方的 Python 插件 certbot-dns-aliyun。
以下是完整的操作步骤:
第一步:准备阿里云 RAM 账号 (AccessKey)
为了安全,绝对不要直接使用阿里云的主账号 Key。请创建一个只有 DNS 权限的子账号。
- 登录 阿里云控制台 -> 搜索 RAM 访问控制。
- 创建用户: 设置用户名(例如
certbot-user),勾选 OpenAPI 调用访问。 - 授权: 点击刚创建的用户 -> 添加权限 -> 搜索并添加
AliyunDNSFullAccess(管理云解析 DNS 的权限)。 - 保存密钥: 复制下来的
AccessKey ID和AccessKey Secret,稍后要用。

第二步:安装 Certbot 和 阿里云插件
由于 Snap 版本的 Certbot 在加载第三方插件时权限管理较严,推荐直接使用 pip (Python包管理器) 来安装,这样兼容性最好。
- 安装 Python3 和 Pip (如果未安装):
bash
# Ubuntu/Debian
sudo apt update
sudo apt install python3-pip python3-venv libaugeas0
# CentOS/Alibaba Cloud Linux
sudo yum install python3-pip
- 创建虚拟环境并安装 (推荐):
为了不污染系统环境,建议在虚拟环境中安装:
bash
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
# 安装 Certbot 和 阿里云 DNS 插件
sudo /opt/certbot/bin/pip install certbot certbot-dns-aliyun
- 建立软连接 (方便使用):
bash
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
第三步:配置阿里云凭证
- 创建配置文件:
在服务器上找个安全的地方(例如/etc/letsencrypt/)创建一个文件aliyun.ini:
bash
sudo vim /etc/letsencrypt/aliyun.ini
- 填入内容 (替换为你第一步获取的 Key):
ini
dns_aliyun_access_key = 你的AccessKeyID
dns_aliyun_access_key_secret = 你的AccessKeySecret
- 设置权限 (非常重要):
为了防止密钥泄露,Certbot 要求该文件权限必须严格:
bash
sudo chmod 600 /etc/letsencrypt/aliyun.ini
第四步:自动申请证书
现在可以运行命令申请证书了。Certbot 会自动调用阿里云 API 添加一条 TXT 记录,验证成功后自动删除。
申请命令:
bash
sudo certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
-d example.com \
-d *.example.com
certonly: 只申请证书,暂不修改 Nginx/Apache 配置(推荐,手动配置更稳妥)。-d *.example.com: 申请泛域名。
如果成功,你会看到 Congratulations,证书文件会保存在 /etc/letsencrypt/live/example.com/ 目录下。

第五步:验证自动续期
Let's Encrypt 证书有效期 90 天。我们需要确认自动续期是否正常工作。
bash
sudo certbot renew --dry-run
- 如果显示
Simulated renewal success,说明配置无误。 - 你可以将该命令加入
crontab,或者依赖系统自带的 timer(通常安装时会自动配置)。 - 注意: 续期后,Nginx/Apache 不会自动加载新证书。你需要加一个
deploy-hook让它续期后自动重启 Nginx。
完善的自动续期命令 (添加到 Crontab):
bash
# 每月1号凌晨4点检查并续期,如果续期成功则重载 Nginx
0 4 1 * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"