LetsEncrypt证书申请

Let’s Encrypt简介

Let’s Encrypt 是 一个叫 ISRG ( Internet Security Research Group ,互联网安全研究小组)的组织推出的免费安全证书计划。参与这个计划的组织和公司可以说是互联网顶顶重要的先驱,除了前文提到的三个牛气哄哄的发起单位外,后来又有思科(全球网络设备制造商执牛耳者)、 Akamai 加入,甚至连 Linux 基金会也加入了合作,这些大牌组织的加入保证了这个项目的可信度和可持续性。
部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。

​ Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!!!也就是说签发证书不需要任何费用。
​ Let’s Encrypt 由于是非盈利性的组织,需要控制开支,他们搞了一个非常有创意的事情,设计了一个 ACME 协议,目前该协议的版本是 v1。
​ 那为什么要创建 ACME 协议呢,传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,完全是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,通过客户端就可以向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 完全是自动化操作的。
​ 任何人都可以基于 ACME 协议实现一个客户端,官方推荐的客户端是 Certbot 。

Let’s Encrypt通配符证书

在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。
1)单域名证书:证书仅仅包含一个主机。
2)SAN 证书一张证书可以包括多个主机(Let’s Encrypt 限制是 20),也就是证书可以包含下列的主机:www.example.com、www.example.cn、blog.example.com 等等。

​ 证书包含的主机可以不是同一个注册域,不要问我注册域是什么?注册域就是向域名注册商购买的域名。对于个人用户来说,由于主机并不是太多,所以使用 SAN 证书完全没有问题,但是对于大公司来说有一些问题:

  • 子域名非常多,而且过一段时间可能就要使用一个新的主机。
  • 注册域也非常多

​ 对于大企业来说,SAN 证书可能并不能满足需求,类似于 sina 这样的网站,所有的主机全部包含在一张证书中,而使用 Let’s Encrypt 证书是无法满足的。通配符证书就是证书中可以包含一个通配符,比如 .example.com、.example.cn,读者很快明白,大型企业也可以使用通配符证书了,一张证书可以用更多的主机了。这个功能可以说非常重要,从功能上看 Let’s Encrypt 和传统 CA 机构没有什么区别了,会不会触动传统 CA 机构的利益呢?

如何申请 Let’s Encrypt 通配符证书

​ 为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。也就是说任何客户端只要支持 ACME v2 版本,就可以申请通配符证书了,是不是很激动。在了解该协议之前有几个注意点:
​ 客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:

  • dns-01:给域名添加一个 DNS TXT 记录。(申请通配符证书,只能使用 dns-01 的方式
  • http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。
  • tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。

acme脚本工具

acme.sh介绍

​ acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。一个纯粹用 Shell(Unix shell)语言编写的 ACME 协议客户端。完整的 ACME 协议实施。 支持 ACME v1 和 ACME v2 支持 ACME v2 通配符证书简单,功能强大且易于使用。你只需要 3 分钟就可以学习它。Let’s Encrypt 免费证书客户端最简单的 shell 脚本。纯粹用 Shell 编写,不依赖于 python 或官方的 Let’s Encrypt 客户端。只需一个脚本即可自动颁发,续订和安装证书。 不需要 root/sudoer 访问权限。支持在 Docker 内使用,支持 IPv6。acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证: http 和 dns 验证.

acme.sh获取与安装

github地址:https://github.com/acmesh-official/acme.sh

安装依赖

1
apt install openssl cron socat curl unzip vim

安装acme.sh

1
2
3
4
curl https://get.acme.sh | sh -s email=my@example.com  #后面输入邮箱,否则会报错
ls -s /root/.acme.sh/acme.sh usr/local/bin/acme.sh #添加软链接
# echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.bashrc
# source ~/.bashrc

开放防火墙端口

1
2
3
4
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F

切换证书机构

1
acme.sh --set-default-ca --server letsencrypt  #使用letsencrypt机构签发证书

申请且安装证书

1
2
3
4
# 申请证书
acme.sh --issue -d 你的域名 --standalone -k ec-256 #使用standalone方式申请证书需要一个空闲的80端口
# 安装证书
acme.sh --installcert -d 你的域名 --ecc --key-file 证书路径/XXX.key --fullchain-file 证书路径/XXX.crt

2.2.6 acme.sh自动保持更新

1
acme.sh --upgrade --auto-upgrade #由于acme协议与LetsetcryptCA都在频繁的更新,所以acme.sh工具也需保持同步

设置证书自动续签

创建shell脚本:letsencryptUpdate.sh

1
2
3
4
5
6
7
8
#!/bin/bash
acme.sh --install-cert -d 你的域名 --ecc --key-file 证书路径/XXX.key --fullchain-file 证书路径/XXX.crt
echo "Certficates Renewed"
chmod +r 证书路径/XXX.key
echo "Read Permission Granted for Private Key"
#此处可添加使有其证书的其它服务
#systemctl restart XXXX.service
#echo "XXX Restarted"

保存后,添加可执行权限

1
chomd +x letsencryptUpdate.sh

设置自动任务crontab -e

1
0 1 1 * * bash 路径/letsencryptUpdate.sh