Let’s Encrypt 是一个数字证书认证机构,旨在推广全民万维网服务器加密连接,为安全网站提供免费的 SSL/TLS 证书。Let’s Encrypt 签发的免费证书有效期为3个月。这里我使用 acme.sh 来申请和续期 Let’s Encrypt 的证书。

环境约定

  • CentOS 7.7 1908

安装 acme.sh

acme.sh 使用 cron 创建计划任务来续期证书,在安装 acme.sh 之前先安装 cron

$ yum install cronie -y
$ systemctl start crond
$ systemctl enable crond

接着就可以来安装 acme.sh 了

$ curl https://get.acme.sh | sh

安装成功后执行 source ~/.bashrc 更新环境变量

生成证书

这里我采用 dns mode 申请证书,以解决 standalone mode 需要 socat 占用 80 端口的困扰。我的域名解析托管在 Cloudflare ,其他解析商请参考 acme.sh 项目的 READEME.md。使用 dns mode 首先需要获取 Cloudflare 账户的 API Key,具体方法如下图

接着进入终端

$ export CF_Key="API_KEY"
$ export CF_Email="EMAIL"
$ acme.sh --issue --dns dns_cf -d example.com -d www.example.com

Let’s Encrypt 也支持申请通配符证书

$ acme.sh --issue --dns dns_cf -d example.com -d *.example.com

source ~/.bashrc 后还报错没有找到 acme.sh 命令,可以尝试手动添加别名

alias acme.sh=~/.acme.sh/acme.sh

安装证书

默认申请的证书放置在 ~/.acme.sh/ 下,但不要直接使用此目录下的证书,以免破坏目录结构。正确的方法是使用 --installcert 参数复制证书至相应的目录

创建用于存放证书的目录

$ mkdir /etc/nginx/ssl

在编辑完 HTTP 服务器配置文件后再复制证书。关于 Nginx HTTPS 及 HTTP2 的配置可以参考这篇文章

$ acme.sh --install-cert -d epnode.com \
--cert-file /etc/nginx/ssl/cert.pem \
--key-file /etc/nginx/ssl/key.pem \
--fullchain-file /etc/nginx/ssl/fullchain.pem \
--reloadcmd "systemctl force-reload nginx"

Nginx 的 reload 参数并不会重载证书,应使用 force-reload