免费TLS证书进阶指南:acme.sh letsencrypt 和cloudflare DNS API

有歧为贵,不取苟同。

——蔡元培

一个算法攻城狮阴差阳错搞起前后端?看我怎么为Nginx注册免费的TLS证书!

准备工作

  • 域名:your.domain (本例中域名挂在 Cloudflare 下)

安装 acme.sh

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.

1
2
# 安装 acme.sh
curl https://get.acme.sh | sh

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

生成 TLS 证书 (CloudflareDNS 验证)

acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP 和 DNS 验证,这里使用 Cloudflare DNS 验证。CloudFlare域API提供了两种自动颁发证书的方法。

使用全局API密钥

登录到CloudFlare帐户以获取API密钥。

1
2
export CF_Key="xxxxxxxxxxxxxxxx"
export CF_Email="[email protected]"

使用新的 CloudFlare API 令牌(Token)

为了使用新令牌,令牌当前需要跨所有区域对Zone.Zone的访问权限和对Zone.DNS的写权限。或者,如果证书仅涵盖单个区域,则可以仅对单个域对Zone.DNS的写访问限制API令牌,然后CF_Zone_ID直接指定。

1
2
3
export CF_Token="aaaaaaaaaaaaaaaa"
export CF_Account_ID="bbbbbbbbbbbbbbbb"
export CF_Zone_ID="cccccccccccccccc"

我们现在可以颁发证书:

1
acme.sh --issue --dns dns_cf -d your.domain -d www.your.domain

该CF_Key和CF_Email或CF_Token和CF_Account_ID将被保存~/.acme.sh/account.conf,需要时会被重用。

安装 TLS 证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置。

1
2
3
4
5
# Nginx example:
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"

(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

--install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.

详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.

更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

TODO

关于 CloudFlare 生成和使用 API 更充实的信息和截图。

Reference

  1. acmesh-official/acme.sh
  2. Let’s Encrypt - Free SSL/TLS Certificates
  3. Cloudflare