使用 let's encrypt 证书
使用 let's encrypt 证书
let's encrypt 是个开放的 CA,提供免费的 tls 证书,旨在提高整个互联网的安全性。
let's encrypt 的自身的根证书已得到一些常见的根证书的签名,通过它颁发的 tls 证书可在大部分的系统、浏览器上使用,兼容性见
https://letsencrypt.org/docs/certificate-compatibility/ 。
let's encrypt 通过 ACME (automatic certificate management environment)协议进行申请和更新,每次申请得到的证书有效期会很短(3个月左右),
到期需要进行更新(商业 tls 证书一般有效期为一、两年左右)。虽然有效期短,但它可以自动更新,在 linux 上使用 acme.sh 时,自动注册了一个
crontab 任务,每天晚上会自动进行检查,可用 crontab -e
查看。
简单介绍下申请步骤
申请域名
向任意的域名注册商申请一个域名,freenom.com 还可以免费注册域名(.tk
/.ml
/.ga
/...)。
域名注册后,一般会被域名注册商的 dns 进行解析和管理,像 freedns / cloudflare,
可迁移到其它的 dns 解析方案,不过要注意迁移到国内进行解析时,是需要备案的。
在选择 dns 解析时,留意下 acme.sh 是否支持对应的 dnsapi https://github.com/Neilpang/acme.sh/wiki/dnsapi ,有相应的 dnsapi 时
才能自动更新。acme.sh 已支持很多的 dns 解析提供商,像 cloudflare、freedns、godaddy、dnspod、万网(aliyun)等。
看看对应的 dnsapi 的文档,在 dns 解析提供商上创建 api 所需要的 id / token / secret 等信息,有些 dnsapi 支持不止一种方式,选择一个合适
的方案即可,如 cloudflare 上使用 account+token
方式。
安装 acme.sh
acme.sh 是 shell 脚本写的,安装时无须 root 账户,直接在需要使用 let's encrypt 的账户中,运行:
curl https://get.acme.sh | sh
相应的脚本会被放到当前用户的 ~/.acme.sh
目录下,安装完成后,需要重新加载一下环境变量才能使用
source ~/.bashrc
现在进行申请,以 cloudflare 的 account+token
(注意看 dnsapi 文档,这个 token 需要读取所有的 zone ,并写对应的 zone.dns )为例:
export CF_Account_ID=<cloudflare 账户 ID>
export CF_Token=<cloudflare token>
acme.sh --force --issue -d example.com -d www.example.com --dns dns_cf
acme.sh 会把环境变量记录下来,在下次进行刷新使用。对应的证书在 ~/.acme.sh
目录下的域名目录里,<xxx>.key
是私钥,fullchain.cer
是带中间证书的完整证书。
使用证书
不同的 web 服务器挂证书的方式有点不一样,需要参考对应的说明文档。
在 nginx 中,配置如下:
server {
listen 443 ssl http2;
ssl_certificate "<fullchain.cer 路径>";
ssl_certificate_key "<*.key 路径>";
...
}
更新一下
nginx -s reload
可以把 reload 放到 crontab,或通过acme.sh 本身支持与 nginx 集成配置。在 acme.sh 颁发证书时自动进行 nginx reload,加上
acme.sh <issue 命令...>
--reloadcmd "nginx -s reload"
同步证书到其它节点
以集群方式部署时,如果不是多节点共享存储,需要把证书同步到其它节点,可直接在 acme.sh
加的 crontab 规则后面加一个 rsync (这里已把公钥添加到了其它机器)
20 0 * * * rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" -a /root/.acme.sh root@10.0.0.9:/root
同时其它节点要定时做下 reload