Len's Study-Log

集中一点,登峰造极!

0%

ACME 随笔

因为免费的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. 登录 腾讯云控制台,进入 访问管理 页面,点击左侧菜单栏的策略,进入策略管理页面,并点击新建自定义策略。

  1. 选择按策略语法创建-空白模板,填写基本信息,并将策略语法修改为以下内容,并点击完成创建。

    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"
    }

步骤二:新建子账号并关联权限策略

  1. 登录 腾讯云控制台,进入 访问管理 页面,点击左侧菜单栏的用户列表,进入用户列表页面,并点击新建用户。

  2. 选择快速创建,填写用户信息,并选择编程访问。

  1. 配置用户权限,仅选择刚刚创建的权限策略,并点击确定保存。

  2. 点击创建用户,完成子账号创建,并记录保存 SecretId 和 SecretKey。

  1. 把 SecretId 和 SecretKey 导入 Linux 环境变量中,以便 acme.sh 调用。

    1
    2
    export Tencent_SecretId="AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    export Tencent_SecretKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

4. 生成证书

  1. 使用 acme.sh 申请证书:

    1
    acme.sh --issue --dns dns_tencent -d www.abc.cn -d aa.abc.cn
  1. 安装证书

    默认生成的证书都放在安装目录下: ~/.acme.sh/,但是不要在web服务器中直接引用目录下的证书文件,也不要手动来拷贝证书文件到具体的web服务器中,手动拷贝会导致之后更新证书流程不能完全自动。

    正确方式是使用acme.sh的安装证书命令,acme.sh自动拷贝证书文件到具体目录中,拷贝命令会被记录下来,之后自动更新证书流程也会执行此拷贝步骤,从而实现更新证书流程的完全自动化。

    格式例子如下:

    1
    2
    3
    4
    5
    acme.sh --install-cert -d xxx \
    --cert-file xxx \
    --key-file xxx \
    --fullchain-file xxx\
    --reloadcmd xxx

    根据web服务器需要的文件按需引入对应的参数,reloadcmd定义证书更新后重启对应的web服务命令。

以nginx为例:

1
2
3
4
acme.sh --install-cert -d www.a.com -d img.a.com \
--key-file /etc/nginx/cert_file/key.pem \
--fullchain-file /etc/nginx/cert_file/fullchain.pem \
--reloadcmd "service nginx force-reload"

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