背景

想私有化部署一个artalk评论,页面显示需要https才能访问,需要配置一个证书和域名。点开阿里云看了一下之前绑定的证书:

1725886388133

之前免费的单域名证书想要12个月,一年的费用都快赶上服务器的费用了。要么每个https服务每三个月手动更新一次,要么每台68,而且还有每年20个证书的限制。通配符的域名还是另外的价格。好在let`s encert 的通配符证书是免费的,并且推荐使用的certbot可以用来自动刷新证书。

安装certbot

这边certbot官网提供了很方便的下载途径,选择对应的需要服务器和安装环境

1725886748380

这里选择使用snap安装

安装snap(已安装可以跳过)

1
2
3
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

删除之前安装过的certbot(可跳过)

1
sudo yum remove certbot

安装certbot

1
2
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

这里certbot已经安装完成了,但是certbot会自动生成证书之前校验域名主权,目前阿里云是不支持的,只支持国外的服务器。所以这里需要安装 aliyun cli

安装aliyun cli工具

1
2
3
4
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

想要通过 aliyun cli来访问DNS服务,需要开放权限。这里通过AK类型凭证进行验证,命令是:

1
2
3
4
5
6
aliyun configure set \
--profile AkProfile \
--mode AK \
--access-key-id **** \
--access-key-secret **** \
--region ****

这里的access-key需要有访问DNS的权限。

获取access-key

阿里云RAM控制台

  1. 身份管理->用户->新增授权
  2. 在权限策略中选择AliyunDNSFullAccess
  3. 点击授权后的用户,创建AccessKey
  4. 保存AccessKey ID 和 AccessKey Secret

将获取到的id和secret以及region替换掉,region是服务器所在的区域ID

1
2
3
4
5
6
aliyun configure set \
--profile AkProfile \
--mode AK \
--access-key-id **** \
--access-key-secret **** \
--region ****

安装 certbot-dns-aliyun

github上有直接通过certbot的开放接口调用aliyun cli的工具 https://github.com/justjavac/certbot-dns-aliyun

这里直接拿来用

1
2
3
4
5
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

申请证书

测试申请

1
certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run

申请证书

1
certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"

测试证书续期

1
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run

同上,没问题的话,去掉--dry-run就是实际证书续费

添加定时任务

1
1 1 */1 * * root certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload"

cron表达式根据需要自己写

生成的证书地址在

/etc/letsencrypt/live/