为你的域名申请统配证书
什么是 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…