Let’s Encrypt实践指北

最近刚好有个项目需要配置HTTPS,也购买了域名,尤其在知道了本文要介绍的“神器” —— Let’s Encrypt 之后,大大简化了学习成本和时间 。
初衷一直以来,对于HTTPS证书的概念都有些含糊不清,似懂非懂 。原因是自己之前比较懒,对于一些需要前置条件(买域名买证书等)才能玩的东西总是积极不起来(对!一定是穷) 。而最近刚好有个项目需要配置HTTPS,也购买了域名(实践时自己还是买了域名),尤其在知道了本文要介绍的“神器” —— Let’s Encrypt之后,大大简化了学习成本和时间 。趁着一些碎片化的时间,研究了证书的一些基本概念以及使用方法,总结下来,以供参考 。另外,在我查找一些相关文档的过程中发现一个问题,就是由于这方面知识的时效性很差,出现很多信息不对等的情况,索性我将参考过的所有官网文档链接贴在了最后,方便大家在看到这篇文章时,根据链接查看最新官方支持情况 。
(Let’s Encrypt 以下简称 “LE”)
Let’s Encrypt不支持IP绑定首先需要说明的是,本来基于成本考虑,是没有打算再购买一个域名来实践HTTPS的,因为市面上的一些主流证书都可以既支持域名,又支持公有IP 。但是由LE官方论坛得知,目前只支持域名,并没有计划支持公有IP 。所以我就打消了这个念头,转而在阿里云上单独购买了一个域名 。
证书类型以下介绍几个关于证书类型的基本概念 。
已知的LE现在支持三种证书类型 。分别是单域名证书,SAN证书和Wildcard证书 。
  • 单域名证书,顾名思义,此证书只包含一个域名,属于基本类型 。
  • SAN证书,一张证书可以包含多个域名,早期用于多个子域名申请同一张证书的情况 。经实践得知,此种证书在使用客户端申请时最大的弊端需要一次性写出所有的域名,对于后期扩展不太方便 。
  • 最后一种是通配符证书,是本文详细介绍的对象 。此种证书类型是LE后期支持的,使用起来极大方便了小型开发团队和个人开发者 。比如针对.example.com这个域名,申请通配符证书(表达式为*.example.com)后,凡是基于它的子域名,都可以使用这个证书 。但为了支持此特性,用于申请证书的客户端也必须要支持ACME的V2版本 。(官方推荐的Cerbot客户端在0.22版本后)
需要注意的是,无论哪种证书,根据LE的最新的中文官方文档(2019年2月24日最后更新),单张证书下最多可包含100个子域名,而每个注册域名(顶级域名)的证书数量是50张/每周,综上所述,每周可为5000个不同的子域名申请证书,且在2019年三月后,续期证书也算入域名证书数量内,对于个人或第三方独立开发者的正常使用而言,这个支持量级是足够的 。
ACME 客户端 —— Cerbot搞清了证书方面的知识,我们接下来看看如何实践 。在客户端方面,LE支持很多种不同的证书申请客户端,官方推荐的是Certbot,但值得注意的是,无论选择哪种客户端,都必须支持 ACME的v2版本,因为从2019年的11月开始,LE将停止通过ACMEv1进行账号注册,计划于2020年的6月开始将停止新域名的验证 。
Certbot 的选择个人建议在实践时使用更为推荐的certbot-auto客户端,在官方的解释中,certbot-auto相当于certbot的wrApper,使用它能自动选择最新版本的cerbot,对已有cerbot进行升级等操作 。并且因为certbot运行时需要用到Python环境,所以对应的依赖也能自动装载到python的虚拟环境中 。
Certbot 插件选择使用Certbot主要分两部分,一部分为申请获取证书,另一部分为在基础设置上安装证书 。而Cerbot本身支持很多插件来简化这些操作 。详情见下表:
Let’s Encrypt实践指北

文章插图
Certbot 插件选择
在申请证书的过程中,LE需要对该域名的所有权进行验证,而以上几个插件都支持了 http-01 或 DNS-01中的一种,亦或是同时支持两种 。不同的验证方式会有不同的操作,这个后面会说 。
实践好了,上面啰啰嗦嗦说了这么多,下面可以进入到实战环节了 。我们以申请通配符证书为例 。
安装certbot-autocd ~wget https://dl.eff.org/certbot-autosudo mv certbot-auto /usr/local/bin/certbot-autosudo chown root /usr/local/bin/certbot-autosudo chmod 0755 /usr/local/bin/certbot-auto/usr/local/bin/certbot-auto --help获取证书这里背景是这样的,由于我们需要申请通配符证书,LE官方FAQ指出只能通过 dns-01的方式来验证 。插件选择manual,表示手动方式来配置 。所以就有了以下这条命令 。


推荐阅读