使用 acme.sh 为您的 CentOS 7 服务器全自动化部署 Let’s Encrypt 证书


一、前言

年初,我写了一篇文章介绍了 Let’s Encrypt 证书以及如何使用 certbot 工具在 CentOS 7 服务器上进行 Let’s Encrypt 证书的自动化部署。

在写完那篇文章后不久,Let’s Encrypt 就推出了通配符证书。

但当时的 certbot 并未支持通配符证书。在经过一番寻找之后,我认识了 acme.sh

acme.sh 是一个基于 ACME(自动化证书管理环境)协议来实现证书部署的 Shell 脚本,支持 Let’s Encrypt 证书的部署。

GitHub 链接:Neilpang/acme.sh

它可以在一个 Shell 脚本中完成证书的签发、安装、应用以及自动更新等操作。相比 certbot 工具方便了不少。

而前几天我刚为我的博客部署了 Cloudflare CDN 服务,现在是时候将 acme.sh 的使用方法整理一下了。

本文将介绍如何通过 acme.sh 使用 Web 验证以及 DNS API 验证(以 Cloudflare 为例)来为服务器部署 Let’s Encrypt 证书。

说明
• 由于证书签署的规则及软件的操作方法随时都有可能发生变化,所以本文具有时效性(最初发表于 2018 年 12 月 1 日)。


二、示例环境

  • 操作系统:CentOS 7.5.1804
  • 域名:example.com

三、安装 acme.sh

执行以下命令:

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

执行后稍等片刻,出现 Install success! 即安装成功。

说明
acme.sh 脚本本身以及使用 acme.sh 签发的证书及各种参数将存放在 /root/.acme.sh 这个目录中。请确保该目录的安全。
• 安装完成后,acme.sh 会在系统中添加一项计划任务。acme.sh 会在每天 0 时的某一分钟检查证书是否需要更新,如果证书需要更新则会自动更新。


四、签发证书

4.1 使用 Web 验证

说明
• 请先配置好 Web 服务器,确保网站的 /.well-known/acme-challenge/ 目录可以以 HTTP(不是 HTTPS)的方式访问。下面将不讲述 Web 服务器的配置方法。
• 如果网站使用了 CDN,请让访问 /.well-known/acme-challenge/ 这个路径的流量不要使用缓存,而且还要防止访问 /.well-known/acme-challenge/ 这个路径的流量被重定向到 HTTPS。

常用命令

/root/.acme.sh/acme.sh --issue [--keylength <ec-256|ec-384>] -d "<域名>" -w <网站所在目录>
选项 功能
--issue 签发证书。
--keylength <ec-256|ec-384> 签发 256 位或 384 位的 ECC 证书。可选。
-d "<域名>" 指定为哪个域名签发证书。
-w <网站所在目录> 指定网站在本地文件系统的位置。

例如

example.com 使用 Web 验证方式签发证书(非 ECC)。网站所在的目录为 /usr/share/nginx/html

/root/.acme.sh/acme.sh --issue -d "example.com" -w /usr/share/nginx/html

执行后稍等片刻,如果看到了 Cert success. 且没有出现红字,说明证书签发成功。

4.2 使用 DNS API(Cloudflare)验证

说明
• 下面以 Cloudflare 为例。其他 DNS 解析商的操作方法可以看下这个链接

4.2.1 获取 API Key

在 Cloudflare 的域名控制面板中点击「Get your API key」,如下图:

然后拉到页面的最下方,在「Global API Key」一栏中点击 View,如下图:

最后输入密码(可能还要验证码)确认即可获取到 API Key。

说明
• API Key 相当于密码,请妥善保管。如果不慎泄漏,可在「Global API Key」一栏中点击「Change」重新生成。

获取到 API Key 之后请执行以下命令:

export CF_Key="<刚才获取的 API Key>"
export CF_Email="<Cloudflare 登录邮箱>"

4.2.2 签发通配符证书

说明
• 由于 DNS API 验证方式支持签发通配符证书,而通配符证书可用于任意子域名及裸域名本身,十分方便。所以下面只介绍如何签发通配符证书。

常用命令

/root/.acme.sh/acme.sh --issue [--keylength <ec-256|ec-384>] -d "<域名>" -d "*.<域名>" --dns dns_cf
选项 功能
--issue 签发证书。
--keylength <ec-256|ec-384> 签发 256 位或 384 位的 ECC 证书。可选。
-d "<域名>" -d "*.<域名>" 为指定的域名签发通配符(可用于裸域名)证书。
--dns dns_cf 指定 DNS 解析商为 Cloudflare。

说明
• 如果您的 DNS 解析商不支持 API 操作,那么 --dns 后面的参数可以省略。执行完命令之后请按照提示在 DNS 解析商的控制面板上设置相关的 TXT 记录,设置完成之后再执行一遍命令即可签发证书。
• 虽然这里指定了两个域名,但实际上只会签发一张证书。而这张证书中包含了两个域名(通配符和裸域名)。

例如

example.com 签发 384 位的 ECC 通配符证书。

/root/.acme.sh/acme.sh --issue --keylength ec-384 -d "example.com" -d "*.example.com" --dns dns_cf

执行后请耐心等待一段时间(会有一个倒计时),如果看到了 Cert success. 且没有出现红字,说明证书签发成功。


五、安装证书

常用命令

/root/.acme.sh/acme.sh --install-cert [--ecc] -d "<域名>" --fullchain-file <证书文件(包含根证书)路径> --key-file <密钥文件路径> [--reloadcmd "<安装证书后执行的命令>"]
选项 功能
--install-cert 安装证书。
--ecc 如果证书是 ECC 证书,请加上该选项。
-d "<域名>" 指定要安装哪个域名的证书。
--fullchain-file <证书文件(包含根证书)路径> 指定证书文件安装的位置。
--key-file <密钥文件路径> 指定密钥文件安装的位置。
--reloadcmd "<安装证书后执行的命令>" 指定安装证书后要执行的命令。可选。

例如

安装 example.com 的证书(非 ECC)。证书文件(包含根证书)的安装位置为 /etc/pki/tls/certs/example.com.pem;密钥文件的安装位置为 /etc/pki/tls/private/example.com_key.pem。安装完成后让 Nginx 加载新的证书(假设 Nginx 已正确配置)。

/root/.acme.sh/acme.sh --install-cert -d "example.com" --fullchain-file /etc/pki/tls/certs/example.com.pem --key-file /etc/pki/tls/private/example.com_key.pem --reloadcmd "systemctl reload nginx"

执行完命令之后如果没有出现红字,说明证书安装成功并且命令已经正确执行。

分享到:

《使用 acme.sh 为您的 CentOS 7 服务器全自动化部署 Let’s Encrypt 证书》上有1条评论

发表评论

电子邮件地址不会被公开。