本文原文发表于我的技术博客 poseiden.top/posts/36547…,比同步于知乎专栏 - 个人三叉戟,欢迎关注。html
一直以来,对于HTTPS证书的概念都含糊不清,似懂非懂。缘由是本身以前比较懒,对于一些须要前置条件(买域名买证书等)才能玩的东西老是积极不起来(对!必定是穷)。而最近恰好有个项目须要配置HTTPS,也购买了域名(其实实践时本身仍是买了域名),尤为是知道了本文要介绍的“神器” —— Let's Encrypt ,大大简化了学习成本和时间。因此趁着一些碎片化的时间,研究了下证书的一些基本概念以及使用,总结下来,以供参考。另外,在我查找一些相关文档的过程当中发现一个问题,就是因为这方面知识的时效性不好,出现不少信息不对等的状况,索性我将参考过的全部官网文档连接贴在了最后,方便你们在看到这篇文章时,根据连接查看最新官方支持状况。 (Let's Encrypt 如下简称 “LE”)python
首先说明的是,原本基于成本考虑,是没有打算另购买一个域名来实践HTTPS的,由于市面上的一些主流证书均可以既支持域名,又能够支持公有IP。可是由LE官方论坛得知,目前只支持域名,并也没有计划支持公有IP。因此我就打消了这个念头,转而在阿里云上单独购买了一个域名。api
如下介绍几个关于证书类型的基本概念。 已知的LE如今支持三种证书类型。分别是 单域名证书,SAN证书和Wildcard证书。单域名证书,顾名思义,此证书只包含一个域名,属于基本类型。SAN证书,一张证书能够包含多个域名,早期用于多个子域名申请同一张证书的状况。经实践得知,此种证书在使用客户端申请时最大的弊端须要一次性写出全部的域名,对于后期扩展不太方便。最后一种是通配符证书,是本文详细介绍的对象。此种证书类型是LE后期支持的,使用起来极大方便了小型开发团队和我的开发者。好比针对.example.com
这个域名,申请通配符证书(表达式为*.example.com
)后,凡是基于其的子域名,均可以使用这个证书。但为了支持此特性,用于申请证书的客户端也必需要支持ACME的V2版本。(官方推荐的Cerbot客户端在0.22版本后)安全
须要注意的是,不管哪一种证书,根据LE的最新的中文官方文档(2019年2月24日最后更新)所示,单张证书下最多可包含100个子域名,而每一个注册域名(顶级域名)的证书数量是50张/每周,综上所述,每周可为5000个不一样的子域名申请证书,且在2019年三月后,续期证书也算入域名证书数量内,对于我的或第三方独立开发者的正常使用而言,这个支持量级是足够的。bash
搞清了关于证书方面的知识,那么咱们接下来看看如何实践。在客户端方面,LE支持不少种不一样的证书申请客户端,官方推荐的为Certbot,但值得注意的是,不管选择哪一种客户端,都必须支持 ACME的v2 版本,由于从2019年的11月开始,LE将 中止经过ACMEv1进行帐号注册,计划于2020年的6月开始将中止新域名的验证。网络
我的建议在实践时使用更为推荐的certbot-auto客户端,在官方的解释中,certbot-auto至关于certbot的wrapper,使用它能自动选择最新版本的cerbot,对已有cerbot进行升级等操做。而且由于certbot运行时须要用到python环境,因此对应的依赖也能自动装载到python的虚拟环境中。app
使用Certbot主要分两部分,一部分为申请获取证书,另外一部分为在基础设置上安装证书。而Cerbot自己支持不少插件来简化这些操做。详情见下表:dom
在申请证书的过程当中,LE须要对该域名的全部权进行验证,而以上几个插件都支持了 http-01 或 dns-01中的一种,亦或是同时支持两种。不一样的验证方式会有不一样的操做,这个后面会说。ide
好了,上面啰啰嗦嗦说了这么多,下面能够进入到实战环节了。咱们以申请通配符证书为例。工具
cd ~
wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto
/usr/local/bin/certbot-auto --help
复制代码
这里背景是这样的,因为咱们须要申请通配符证书,LE官方FAQ指出只能经过 dns-01
的方式来验证。插件选择 manual
,表示手动方式来配置。因此就有了如下这条命令。
certbot-auto certonly
\ -d *.your_domain.com --manual --preferred-challenges dns
\ --server https://acme-v02.api.letsencrypt.org/directory
复制代码
这里几个参数着重说一下:
*.domain.com
,而不是 domain.com
DNS plugins
dns-01
验证方式返回的命令行输出以下:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): your_email@gmail.com
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for your_domain.com
-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that.
Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y
复制代码
从这里开始须要一些交互:
上步以后,命令行输出以下:
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.your_domain.com with the following value:
`一串base64编码`
Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
复制代码
这时不要着急继续,按照上述提示,须要去你的DNS服务提供商那里手动配置一条记录,用于验证你对此域名的全部权。以Azure为例,以下图。
配置好以后,过一分钟左右,利用dig命令查询一下是否生效:
$ dig -t txt _acme-challenge.your_domain.com @8.8.8.8
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.your_domain.com. IN TXT
;; ANSWER SECTION:
_acme-challenge.your_domain.com. 599 IN TXT "刚才那串base64编码"
复制代码
这里必定注意,有ANSWER SECTION
才算成功,我第一次配置错了没有出来这个,但也没有注意到,因而敲回车键就挂掉了。不过你们在实践中若是挂掉了也不要担忧,从新执行命令便可。
网络没什么问题的话这步就应该已经成功了,输出的信息会提示你证书生成的所在位置。不出意外的话应该在 /etc/letsencrypt/archive/your_domain.com
下。这里值得注意的是,LE申请的证书有效期通常都是为三个月,因此到期后须要再次申请,网上相关自动化工具一抓一大把,就不在这里赘述了。若是遇到问题,能够继续探讨。