直接通过 Certbot 通过DNS方式申请域名证书后,因为在续订时需要更新 DNS 记录,所以不能直接使用 certbot renew 更新。本文介绍使用 certbot-dns-aliyun 脚本自动调用阿里云接口,自动申请和续订域名证书。
aliyun cli 工具
安装
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
tar xzvf aliyun-cli-linux-latest-amd64.tgz
sudo cp aliyun /usr/local/bin
rm aliyun
配置
登录 https://ram.console.aliyun.com/ 添加用户,开启 OpenAPI 调用访问权限,开启 AliyunDNSFullAccess 授权。
sudo aliyun configure
根据引导填入信息,其中 AccessKeyID 和 AccessKeySecret 在阿里云RAM中,创建完用户后获取。
Access Key Id []: AccessKeyID
Access Key Secret []: AccessKeySecret
Default Region Id []: cn-beijing
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en: zh
后面 certbot 需要在root 用户运行,所以这里也需要使用 root 用户配置,否则会报错
Hook '--manual-cleanup-hook' for beekc.top reported error code 3
Hook '--manual-cleanup-hook' for beekc.top ran with error output:
ERROR: region can't be empty
Configuration failed, use `aliyun configure` to configure it
没有在阿里云RAM中给用户授权 AliyunDNSFullAccess,会报错
Hook '--manual-auth-hook' for beekc.top ran with error output:
ERROR: SDK.ServerError
ErrorCode: Forbidden.RAM
配置成功会显示
Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............
cerbot-dns-aliyun
安装
wget https://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh
sudo cp alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns
rm alidns.sh
申请&续订
# 测试申请
certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
# 测试续期
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
# 正式申请和续期时去掉 --dry-run 参数
自动续期
添加定时任务
crontab -e
输入
1 4 1 */1 * root certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload"
在Crontab中,定时任务的格式由五个星号组成,这五个星号分别代表分钟(0 – 59)、小时(0 – 23)、日期(1 – 31)、月份(1 – 12)、星期几(0 – 7,0和7都表示星期日)。1 4 1 */1 *
表示每个月的第一天的凌晨4点1分执行任务
最后的--deploy-hook "nginx -s reload"
表示在续期成功后自动重启 nginx,需根据实际情况调整。