蓝图云服务器 本文演示如何使用 Let’s Encrypt 通过 DNS 验证申请免费泛域名(wildcard)证书,并示范如何使用腾讯 DNSPod API 自动完成 DNS 验证以实现证书自动续期。还包···
蓝图云服务器
本文演示如何使用 Let’s Encrypt 通过 DNS 验证申请免费泛域名(wildcard)证书,并示范如何使用腾讯 DNSPod API 自动完成 DNS 验证以实现证书自动续期。还包含在 Ubuntu 上部署、调试和定时自动执行的实用建议。
一、如何申请免费的泛域名证书
1. 环境准备
确保你的域名管理控制台可操作 DNS 记录(可以添加/删除 TXT 记录)。服务器能访问外网,并安装了 Certbot。如果你打算自动续期并使用 DNS API(如 DNSPod),需要在 DNS 服务商处创建 API 密钥并妥善保存。2. 安装Certbot
云服务器 http
确保在您的服务器上安装了Certbot。以下是在Ubuntu上的安装命令:
sudoapt updatesudoapt install certbot3. 使用DNS验证方法申请泛域名证书
Lets Encrypt支持多种验证方法,但由于泛域名证书的要求,您需要使用DNS验证方法。以下是步骤:
1)申请证书
运行以下命令,使用DNS验证请求泛域名证书(在命令中用您的实际域名替换example.com):
sudocertbotcertonly--manual--preferred-challengesdns-d"*.example.com"-d"example.com"-d "*.example.com":表示您要申请泛域名证书。-d "example.com":这也是您的主域名(需要同时申请)。2) 添加DNS TXT记录
Certbot会提示您添加一条DNS TXT记录以进行验证。您将看到类似以下内容:
Please deploy a DNS TXT record under the name _acme-challenge.example.comwiththefollowingvalue:根据提示,登录到您的域名注册商或DNS提供商的控制面板,添加上述TXT记录。请注意:可能需要一些时间让DNS记录生效,您可以使用dig或nslookup命令来检查TXT记录是否已正确添加。
3) 完成验证过程
添加了DNS TXT记录后,返回到命令行并按Enter键继续。Certbot将验证DNS记录并颁发SSL证书。
4) 配置和安装证书
Lets Encrypt证书通常会存储在如下路径中:
/etc/letsencrypt/live/example.com/fullchain.pem(证书)/etc/letsencrypt/live/example.com/privkey.pem(私钥)您可以将这两个文件配置到您的Web服务器(如Nginx或Apache)中。
二、自动续期-dnspod(腾讯)
手动每次添加 TXT 记录很不方便,推荐用 DNS 服务商的 API 自动完成 DNS 验证。下面以 DNSPod 为例说明自动化流程。
1、获取 DNSPod API 密钥
登录 DNSPod 控制台(https://console.dnspod.cn/)-> 我的账号 -> API 密钥,获取 SecretId/SecretKey(或 DNSPod 的 token,视版本与控制台而定)。妥善保管这些密钥,不要泄露。
2、准备 Python 虚拟环境(可选,但推荐)
在虚拟环境中安装运行依赖,避免污染系统 Python。示例:python3 -m venv /home/youruser/myenvsource/home/youruser/myenv/bin/activate
(参考零错配置 Python 虚拟环境:venv/virtualenv 教程 + 常见问题与快速入门 - 水元素的文章 - 知乎
云服务器 内存
零错配置 Python 虚拟环境:venv/virtualenv 教程 + 常见问题与快速入门)pip install tccli
tccli 是腾讯云命令行工具,可以操作 DNSPod(参考:https://cloud.tencent.com/document/product/440/34012)。也可以使用官方 SDK 或其他第三方脚本(如 acme-dns、lexicon)来操作 DNS。
3、虚拟环境中安装tccli
pipinstall tccli命令行工具 TCCLI 配置方法_腾讯云 //tccli使用方法
4、编写续期脚本
供certbot回调的脚步dnspod.sh
!/bin/bashsource/home/hewuli/myenv/bin/activate RECORD_FILE="/tmp/_acme-challenge.${CERTBOT_DOMAIN}_${CERTBOT_VALIDATION}"if!command-v tccli >/dev/null;thenecho"TCCLI is required: https://cloud.tencent.com/document/product/440"1>&2exit1fiif["$1"="clean"];then删除 DNS TXT 记录RECORD_ID=$(cat${RECORD_FILE})if[ -n"${RECORD_ID}"];thentccli dnspod DeleteRecord --cli-unfold-argument --Domain${CERTBOT_DOMAIN} --RecordId${RECORD_ID} >/dev/nullfirm -f${RECORD_FILE}else创建 DNS TXT 记录RECORD_ID=$( tccli dnspod CreateRecord --cli-unfold-argument --Domain${CERTBOT_DOMAIN} --SubDomain _acme-challenge --RecordType TXT --RecordLine 默认 --Value${CERTBOT_VALIDATION} --TTL 600 | grep"RecordId"| grep -Eo"[0-9]+")echo${RECORD_ID}>${RECORD_FILE}sleep 20等待 DNS 记录传播fi编写certbot续签脚本update_cert.sh
!/bin/bashsudo certbot renew --manual --preferred-challenges=dns --manual-auth-hook"./dnspod.sh"--manual-cleanup-hook"./dnspod.sh clean"--deploy-hook"ls"5、定期执行update_cert.sh
我们使用常用的方法cron
编辑 root 的 crontab(如果需要 root 权限):bashsudo crontab -e添加一行(每天 03:30):
303* * * /usr/local/bin/update_cert.sh >> /var/log/update_cert.log2>&1说明:重定向日志到 /var/log/update_cert.log,有助于排错。确保脚本可执行并在脚本顶部指定 PATH 或在 crontab 中设置 PATH,例如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin303* * */usr/local/bin/update_cert.sh >>/var/log/update_cert.log 2>&1三、宝塔申请证书和自动续签-dnspod(方便)
1. 申请证书流程
打开宝塔面板,点击网站菜单后,点击"未部署"
申请证书
申请成功
2. 设置脚本自动续签
当前的证书有效期是3个月,可以设置2个月自动更新一次
3. 证书保存路径
路径如下:
/www/server/panel/vhost/letsencrypt/*.http://xxx.cn/
可以查看一下:
四、示例资源和参考
Certbot 官方文档:https://certbot.eff.org/DNSPod API / tccli 文档:命令行工具 TCCLI 配置方法_腾讯云acme.sh 项目:https://github.com/acmesh-official/acme.sh阿里云服务器通过测试

发表评论
最近发表
标签列表