如何使用 FreeSSL 近期更新的 ACME 管理功能

freessl-acme-manage-2

该功能能够使你通过一个 shell 脚本进行证书的全自动签发、部署、更新(该脚本需要安装到你的服务器上,而不是个人pc)。脚本基于 acme.sh 进行改造。

FreeSSL.cn 的 ACME 服务器地址:https://acme.freessl.cn/directory

使用须知:

FreeSSL 服务器目前支持:

  • TrustAsia 单域名证书
    • DNS 前缀:_dnsauth
    • 文件路径:/.well-known/pki-validation/fileauth.txt
  • Let's Encrypt 多域名证书
  • Let's Encrypt 通配符证书
    • DNS 前缀:_acme-challenge
    • 文件路径:/.well-knwon/acme-challenge/$token

由于 TrustAsia DNS 验证前缀、文件验证路径等原因,我们已将脚本内容适配到 freessl.cn 定制的 ACME 服务器,请悉知。所以该脚本不通用。

注意事项:

  1. 执行脚本的时候请指定服务器地址:--server https://acme.freessl.cn/directory
  2. FreeSSL.cn 后台可以配置申请域名的策略用于指定某个域名申请哪个品牌的证书,默认 TrustAsia。
  3. 由于关联着 FreeSSL.cn:
    • 在使用脚本注册 acme 客户端的时候,需要指定 --acountemail 为你在 FreeSSL.cn 账号的邮箱。
    • 如果你的脚本是从 FreeSSL 后台获取的命令进行安装,那么你的 acme 客户端将会自动激活。如果不是,需要你到 FreeSSL 后台进行手动激活。
    • 添加的域名策略,可以匹配到该域名及其子域名。

如何使用

1、安装脚本

从 FreeSSL 《ACME管理》后台获取安装命令:

$ curl https://freessl.cn/api/get.acme.sh?token=6df9c4e9-8485-4733-9bd6-07dd161cc99b | sh
或
$ wget -O - https://freessl.cn/api/get.acme.sh?token=6df9c4e9-8485-4733-9bd6-07dd161cc99b | sh

请根据你的服务器支持的命令 curlwget 进行安装。看到下图便是安装成功:
freessl-acme-install

当然你也可以通过 curl https://freessl.cn/api/get.acme.sh | sh 进行安装,不过注册 acme客户端 的时候需要到 FreeSSL 后台手动激活。

2、注册客户端

想要使用该脚本必须注册一个 ACME客户端,这是 ACME 协议所规定的。这里必须指定一个你在 FreeSSL 注册的邮箱,这样才能与 FreeSSL Web 端相关联。

$ acme.sh --register-account --accountemail henry@example.com \
  --server https://acme.freessl.cn/directory
...
[Fri Nov 16 02:47:57 UTC 2018] ACCOUNT_THUMBPRINT='rl8EwomzH7YzhpKq8G2Zpo0Bx6I_ml04IGgmnzNdIII'

当看到 ACCOUNT_THUMBPRINT=xxx 就成功了。

3、申请证书

如果注册客户端的时候不是从 FreeSSL 获取的命令安装,可能你需要到 FreeSSL 后台激活你刚刚注册的客户端。
freessl-acme-switch

申请证书的方式基本与原脚本一样 acme.sh wiki

例1: 普通模式
example.com 申请证书,验证文件将会写入 -d 所指定的位置。请确保该目录能够从外网访问到,便于 CA 进行验证。

acme.sh --issue -d example.com -w /home/wwwroot/example.com \
  --server https://acme.freessl.cn/directory

acme.sh --issue -d example.com -w /home/username/public_html \
  --server https://acme.freessl.cn/directory

acme.sh --issue -d example.com -w /var/www/html \
  --server https://acme.freessl.cn/directory

例2: Nginx 模式
如果你当前的服务器已经存在服务并由 nginx 进行代理。需要你是 root 或 sudoer,因为脚本需要与 Nginx 服务进行交互。

acme.sh --issue --nginx -d example.com \
  --server https://acme.freessl.cn/directory

例3: 自动 DNS API 集成
该模式通过集成 DNS API,实现 DNS 验证记录的自动添加删除。你可以到这里了解详情:https://github.com/Neilpang/acme.sh#7-automatic-dns-api-integration

例4: DNS 手动模式
该模式是要进行 DNS 验证,但又没有 DNS 服务商相关 key 的情况下使用。

  1. 第一步:
acme.sh --issue -d example.com --dns \
  --server https://acme.freessl.cn/directory \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please
  1. 将 TXT 记录添加到你的 DNS 记录中。
  2. 使用 --renew 命令:
acme.sh --renew -d example.com \
  --server https://acme.freessl.cn/directory \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

安装证书

当我把证书颁发下来之后,因为证书现在只是保存在 ~/.acme.sh/$domain 下面。我们还需要进行证书的安装:
Apache 例子:

acme.sh --install-cert -d example.com \
  --cert-file      /path/to/certfile/in/apache/cert.pem  \
  --key-file       /path/to/keyfile/in/apache/key.pem  \
  --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
  --reloadcmd     "service apache2 force-reload"

Nginx 例子:

acme.sh --install-cert -d example.com \
  --key-file       /path/to/keyfile/in/nginx/key.pem  \
  --fullchain-file /path/to/fullchain/nginx/cert.pem \
  --reloadcmd     "service nginx force-reload"

如何实现全自动

当我们的证书颁发完成之后,acme.sh 脚本会每天去检查它所管理的证书是否即将到期(过期前30天),此时,它将通过你上次申请该证书的方式重新申请证书。如果你也添加了 --renew-hook,从此就不管用管证书的是否到期了:

$ acme.sh --force --issue --dns dns_ali \
    -d example.com -d www.example.com \
    --renew-hook "acme.sh \
        --install-cert -d example.com \
        --key-file       /usr/local/ssl/domain.rsa.key \
        --fullchain-file /usr/local/ssl/domain.rsa.pem \
        --reloadcmd      \"service nginx force-reload\""