什么是 Let’s Encrypt

Let’s Encrypt 由于是非盈利性的组织,需要控制开支,他们搞了一个非常有创意的事情,设计了一个 ACME 协议,目前该协议的版本是 v2。

那为什么要创建 ACME 协议呢,传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,完全是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,通过客户端就可以向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 完全是自动化操作的。

任何人都可以基于 ACME 协议实现一个客户端,官方推荐的客户端是 Certbot。本篇博客中我所使用的是 acme.sh(ACME Shell script)

什么是通配符证书

在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。

  • 单域名证书:证书仅仅包含一个主机。
  • SAN 证书:一张证书可以包括多个主机,也就是证书可以包含下列的主机:www.betterde.com、george.betterde.com、*.betterde.com 等等。

校验域名的所有权的方式

目前 Let’s Encrypt 支持三种验证方式:

  • dns-01:给域名添加一个 DNS TXT 记录;
  • http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件;
  • tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。

关于 ACME Shell script

acme.sh 是一个用 Shell 实现了 acme 协议的开源项目,特点如下:

  • 支持 ACME v1
  • 支持 ACME v2
  • 支持通配符证书申请
  • 简单易使用
  • 支持 IPv6
  • 支持 Cron 自动续签证书
  • 支持多家CA机构
  • 支持多种域名所有权检验方式:Webroot、Standalone、Standalone tls-alpn、Apache、Nginx、DNS、DNS alias 和 Stateless

使用 ACME Shell script

安装

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

安装过程中脚本会执行如下操作: 1.在当前用户的 $HOME 目录创建 .acme.sh 的目录 2.创建命令的别名 acme.sh=~/.acme.sh/acme.sh 3.创建用于检查和续签证书的定时任务

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

校验域名的所有权的方式

本文采用的是阿里云的DNS,为了全自动化,需要先获取阿里云控制台的 Key 和 Secret,点击获取。其他方式请参考acme.sh 的 Github 项目文档

获取到 Key 和 Secret 后在命令行执行:

export Ali_Key="复制你的Key到这里"
export Ali_Secret="复制你的Secret到这里"

当你执行 acme.sh 时,它会自动保存这些信息到 ~/.acme.sh/account.conf 文件中,以便于下次自动续签时使用

申请统配证书

acme.sh --issue --dns dns_ali -d example.com -d *.example.com
  • dns_ali 为服务商名称,具体可以参考官方文档
  • 第一个域名,是你要申请的主域名,如:bettere.com;
  • 第二个是泛解析域名,如:*.betterde.com;

这种方式将自动为你的域名添加一条 txt 解析,验证成功后,这条解析记录会被删除,所以对你来说是无感的,就是要等 120秒。证书生成成功后,默认保存在 ~/.acme.sh/ 你的顶级域名中。

执行完成后将在 ~/.acme.sh/ 目录下生成对应域名的一个目录,结构如下:

.
├── backup              # 生成新证书时,将久的证书备份到该目录下
│   ├── fullchain.bak
│   └── key.bak
├── example.com.cer
├── example.com.conf    # 域名配置文件,保存了证书的有效日期、检验方式等信息
├── example.com.csr
├── example.com.csr.conf
├── example.com.key
├── ca.cer
└── fullchain.cer

部署证书

acme.sh --install-cert -d example.com \
--cert-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

上述命令,用于将证书文件部署到指定的目录下,同时将配置信息写入 ~/.acme.sh/DOMAIN/DOMAIN.conf 文件中,用于续签时,重新部署,reloadcmd 的命令用于告诉 HTTP 服务器,重新加载配置文件和证书,请根据自己的 HTTP 服务器自行定义。

完成

到这里我们的证书申请就完成了,下一篇文章中我将介绍如何给 Nginx 配置 HTTPS。

I hope this is helpful, Happy hacking…