因为免费的SSL证书下个月就要过期了,按照新规定,免费证书的有效期下降至3个月。本人不想老是折腾,所以,找到ACME这个工具来定期自动签发免费SSL证书。
参考文章:
ACME(自动证书管理环境)是一个互联网工程任务组维护的协议,它允许自动化 Web 服务器证书的部署,acme.sh 是支持 ACME 协议流行的客户端之一,可以通过其实现 SSL 证书的自动申请、续期等等。
1. 安装 ACME
1 | curl https://get.acme.sh | sh |
安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/
安装程序会自动做以下操作:
- 自动把 acme.sh 安装到你的 home 的
.acme.sh
目录下,即~/.acme.sh/
(在Linux中,隐藏目录是以点.
开头的) - 自动创建一个 bash 的 alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
- 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
2. 更改证书CA
1 | acme.sh --set-default-ca --server letsencrypt |
acme被ZeroSSL收购,其默认的证书方式为ZeroSSL,但此证书生成时会携带邮箱,因此更换为letsencrypt。
当然,也可以在生成证书时加一个--server
参数来决定生成什么证书:
1 | --server letsencrypt |
3. 配置使用腾讯云自动解析DNS
因为我的服务器是腾讯云的轻量应用服务器,所以直接就用腾讯云的API了。
步骤一:新建权限策略
选择按策略语法创建-空白模板,填写基本信息,并将策略语法修改为以下内容,并点击完成创建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"statement": [
{
"action": [
"dnspod:DescribeRecordFilterList",
"dnspod:DescribeRecordList",
"dnspod:CreateRecord",
"dnspod:DeleteRecord"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}
步骤二:新建子账号并关联权限策略
配置用户权限,仅选择刚刚创建的权限策略,并点击确定保存。
点击创建用户,完成子账号创建,并记录保存 SecretId 和 SecretKey。
把 SecretId 和 SecretKey 导入 Linux 环境变量中,以便 acme.sh 调用。
1
2export Tencent_SecretId="AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export Tencent_SecretKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
4. 生成证书
使用 acme.sh 申请证书:
1
acme.sh --issue --dns dns_tencent -d www.abc.cn -d aa.abc.cn
安装证书
默认生成的证书都放在安装目录下:
~/.acme.sh/
,但是不要在web服务器中直接引用目录下的证书文件,也不要手动来拷贝证书文件到具体的web服务器中,手动拷贝会导致之后更新证书流程不能完全自动。正确方式是使用acme.sh的安装证书命令,acme.sh自动拷贝证书文件到具体目录中,拷贝命令会被记录下来,之后自动更新证书流程也会执行此拷贝步骤,从而实现更新证书流程的完全自动化。
格式例子如下:
1
2
3
4
5acme.sh --install-cert -d xxx \
--cert-file xxx \
--key-file xxx \
--fullchain-file xxx\
--reloadcmd xxx根据web服务器需要的文件按需引入对应的参数,reloadcmd定义证书更新后重启对应的web服务命令。
以nginx为例:
1 | acme.sh --install-cert -d www.a.com -d img.a.com \ |
5. 更新证书
目前证书在 60 天以后会自动更新,你无需任何操作,因为在acme.sh安装时,已经把相关的自动更新程序写入到crontab中,如果想要查看,可以通过以下命令:
1 | crontab -l |
输出内容包含一个自动更新程序,大致内容如下:
1 | 56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null |
停止自动更新(移除域名证书)
1 | acme.sh --remove -d example.com |
或者手动在~/.acme.sh/
目录下删除对应的域名目录,如~/.acme.sh/a.com
。
升级ACME
1 | acme.sh --upgrade |
执行出错怎么办
执行错误,可以查看日志,或者执行命令添加--debug 2
参数,开启debug模式
1 | acme.sh --issue ..... --debug 2 |