toc
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/acmesh-official/acme.sh 。
首先安装 socat,acme.sh 依赖 socat。
yum install -y socat
安装 acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
这里需要提供你的电子邮件地址,因为 acme.sh 使用了 zerossl.com 提供的 CA,所以需要注册一下。
检查 acme.sh 是否安装成功。
crontab -l
如果安装正确,会有如下显示(第一列分钟是随机数):
41 9 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.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 里面的命令提示如下错误
~/.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
打完收功。