使用 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

posted @ 2019-12-13 11:18  drop *  阅读(1621)  评论(0编辑  收藏  举报