Certobot管理Let's Encrypt证书的几个经验

很多人经常在使用 Certbot 申请 Let's Encrypt 证书的时候,犯一些小错误,或者不知道如何正确操作,这篇文章简单总结下我的一些经验,后续如果还有一些新的收获,还会随时介绍。
废话少说,下面列举下我的一些小经验。

1:设置邮箱接收证书过期的通知

在使用 certbot 的时候,很多人没有意识到 account 的创建,每个 account 对应一个 email 地址,可以通过下列命令修改 account 对应的 email 地址。

$ certbot-auto register --update-registration --email admin@example.com

那配置 email 的用处是什么呢?一张 Let's Encrypt 证书有效期是 90 天,有效期太短,很多人忘记续期,Let's Encrypt 会在证书快过期的时候,给 email 地址发送证书快过期的通知。

2:使用 certbot 还是 certbot-auto?

certbot 和 certbot-auto 本质上没有区别,但很多人疑惑两者的区别,certbot-auto 对 certbot 做了包装,可以设置系统环境或自动升级。

我个人更喜欢 certbot-auto 的安装方式:

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x ./certbot-auto

而如果使用包安装方式,安装的是 certbot 工具。

$ apt-get install certbot 

3:不要 rm 删除证书

由于 Let's Encrypt 证书可以通过工具自由申请,很多人会无节制的操作,从而出现了很多无用证书,很多操作者不知道如何处理这些旧证书,就轻易的 rm 删除。

这是非常不好的一个习惯,因为一些证书如果没有到期,被攻击者利用了就比较麻烦,正确处理无用证书的方式如下。

先查看目前机器上申请过的证书:

$ certbot-auto certificates

输出如下:

Found the following certs:
  Certificate Name: simplehttps.com
    Domains: *.simplehttps.com
    Expiry Date: 2018-10-15 05:21:15+00:00 (VALID: 52 days)
    Certificate Path: /etc/letsencrypt/live/simplehttps.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/simplehttps.com/privkey.pem
  Certificate Name: yudadan.com
    Domains: *.yudadan.com *.simplehttps.com
    Expiry Date: 2018-10-15 04:52:47+00:00 (VALID: 52 days)
    Certificate Path: /etc/letsencrypt/live/yudadan.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/yudadan.com/privkey.pem

然后吊销证书,相当于通知 Let's Encrypt,该证书已经无效了。

$ certbot-auto revoke --cert-path /etc/letsencrypt/live/yudadan.com/cert.pem --reason superseded 

-- reason 表示是吊销证书的原因,命令运行成功后,/etc/letsencrypt/renewal、/etc/letsencrypt/archive、/etc/letsencrypt/live 下对应的文件都会被删除。

4:你喜欢采用那种域名校验方式

Let's Encrypt 提供了很多插件,能够满足各种场景下的证书管理,对于个人网站来说,可能只有一台 Web 服务器,在这台机器上申请、续期证书,然后 Web 服务器直接引用证书即可,非常的方便。

对于大型企业来说,服务器非常多,Web 服务器、7层负载均衡设备都需要部署证书,一般会专门找一台机器(中控机)运行 Certbot,一旦更新证书,就通过各种方式(最简单的可能就是 rsync)将证书和密钥对分发到目标服务器上。

在申请证书的时候,Let's Encrypt 会校验申请者的身份,也就是要确认域名的所有权,主要有三种方式,分别是 http-01、tls-sni-01、dns-01,如果由中控机统一管理证书,建议采用 dns-01 的验证方式。

在中控机上运行 Certbot,一般情况下无法绑定域名到这台机器上,而 http-01、tls-sni-01 需要启动 web 服务,所以理论上来看,这两种校验方式无法使用。唯一的校验方式就是 dns-01,其实这也是最简单、最直接的方式,如果不想手动配置域名 DNS 解析记录,可以采用一些插件或一些 hook 来自动处理。

5:使用 staging 服务器

申请 Let's Encrypt 证书都是工具化的,为了防止滥用,Let's Encrypt 对申请证书做了一定的数量限制。

如果操作不熟练,很容易陷入限制,为避免产生这种情况,可以采取两种方式。

(1)--test-cert

在测试 Certbot 的时候,输入该参数,表示向 staging 服务器发送请求,staging 服务器的限制阀值比较大,不会影响证书申请。

等熟练掌握 Certbot 操作后,再向真实服务器发送请求。

(2)--dry-run

当使用 renew 或 certonly 操作 Certbot 的时候,加入该参数,不会真正保存证书到本地,也就是说不会陷入限制,这对测试 Certbot 操作非常有用。

6:不要轻易修改 renewal 文件。

在 Certbot 中,所有的证书管理操作都保存在 renewal 文件中,该文件相当于索引,用户管理证书,打开 /etc/letsencrypt/renewal/simplehttps.com.conf 文件,内容如下图:

图1

archive_dir 等配置指向一个软连接,指向了实际的证书。renewalparams 参数存储了很多申请证书时用到的配置,比如 server 表示 Let's Encrypt 的服务器地址(v2版本),采用了 manual(手动)插件,使用 dns-01 域名验证方式,manual_auth_hook 表示采用的 hook 文件。

这个文件对 Certbot 至关重要,比如 renew 证书的时候会用到,一般情况下不要手动修改,如果 archive 目录下证书文件移动了,可以修改相关连接参数,然后运行下列命令,重置 renewal 文件。

$ certbot-auto update_symlinks

7:authenticators 插件和 installers 插件别混淆。

在 Certbot 中,存在两种类型的插件,可在运行具体命令参数的时候,很多人会混淆。

下面两条命令作用是相同的:

$ certbot-auto
$ certbot-auto run install 

其中 run 表示申请证书,install 表示采用 installers 插件。

下面两条命令是相同的:

$ certbot-auto  certonly  
$ certbot-auto run certonly

表示采用 authenticators 插件。

在我刚开始学习的时候,总是搞不清楚相关命令行参数,现在明白了吗?

我最近写了一本书《深入浅出HTTPS:从原理到实战》,欢迎去各大电商购买,也欢迎关注我的公众号(yudadanwx,虞大胆的叽叽喳喳),了解我最新的博文。

推荐阅读更多精彩内容