在 CentOS 7 上,使用 Let's Encrypt 安装免费的 HTTPS 证书

发布日期:2020年01月07日更新日期:2020年07月17日本文同步发表于公众号:

Cover

Let's Encrypt 是什么

Let’s Encrypt 是一家全球性的证书颁发机构(CA)。我们让世界各地的人们和组织获取、续期和管理 SSL/TLS 证书。网站可以使用我们的证书来启用安全的 HTTPS 连接。

Let’s Encrypt 提供域名验证型(DV)证书。我们不提供组织验证(OV)或扩展验证(EV),这主要是因为我们无法自动化地颁发这些类型的证书。

Let’s Encrypt 是一个非营利性组织,我们的任务是通过促进 HTTPS 的广泛采用来创建一个更加安全和尊重隐私的 Web 环境。我们的服务免费且易于使用,因此每个网站都可以使用它来部署 HTTPS。

本文能够达到的效果

  • 申请 Let's Encrypt 免费 HTTPS 证书。
  • 申请泛域名证书,这样一个证书支持所有子域名共用。
  • 由于 Let's Encrypt 的证书有效期很短(90 天),acme.sh 能够自动更新证书。

操作步骤

注意:下面所有操作,全程使用 root 账户。

假设已经安装好了 Nginx 服务器。

假设要配置的域名是 example.com,并且托管在阿里云。

安装 acme.sh

acme.sh 的网站是:https://github.com/Neilpang/acme.sh

首先安装 socat,acme.sh 依赖 socat。

# yum install -y socat

安装 acme.sh

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

检查 acme.sh 是否安装成功。

# crontab -l

如果安装正确,会有如下显示(第一列分钟是随机数):

11 0 * * * "/home/jitao/.acme.sh"/acme.sh --cron --home "/home/jitao/.acme.sh" > /dev/null

设置访问 DNS 的密钥

为了验证待申请域名的所有权,acme.sh 需要在 DNS 服务器添加记录,用来验证。

这里采用阿里云 API 的方式,其它 API(CloudFlare,DNSPod,GoDaddy,等),及服务器验证方式,请查看 acme.sh 文档。

在阿里云创建一个 RAM 子账户,获得 Key 和 Secret,设置到环境变量。

# export Ali_Key="替换我"
# export Ali_Secret="替换我"

申请证书

我们申请一个泛域名的证书,这样,所有二级域名都可以共享这个证书了。

# ~/.acme.sh/acme.sh --issue --dns dns_ali -d example.com -d *.example.com

等待一大堆输出后,会有如下显示,表明申请成功。

Your cert is in  /root/.acme.sh/example.com/example.com.cer
Your cert key is in  /root/.acme.sh/example.com/example.com.key
The intermediate CA cert is in  /root/.acme.sh/example.com/ca.cer
And the full chain certs is there:  /root/.acme.sh/example.com/fullchain.cer

安装证书

这面这条命令将证书安装到 Nginx 配置目录,并设置当证书更新时,如果让新证书生效。

# ~/.acme.sh/acme.sh --installcert -d example.com --key-file /etc/nginx/ssl/example.com.key --fullchain-file /etc/nginx/ssl/example.com.cer --reloadcmd "systemctl force-reload nginx"

升级 acme.sh(2020-07-17 更新)

如果发现证书没有自动更新,并且执行 crontab 里面的命令提示如下错误

# /root/.acme.sh/acme.sh --cron --home /root/.acme.sh
...
Getting domain auth token for each domain
It seems the CA server is busy now, let's wait and retry. Sleeping 1 seconds.

就需要升级 acme.sh 了,升级命令

# ~/.acme.sh/acme.sh --upgrade

打完收功。