什么是 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 \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx reload"

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

完成⌗

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

I hope this is helpful, Happy hacking…