随着主流网站使用https越来越普及,并且https的安全性保障,本小站也是心里痒痒想弄这么一个东西,左看右看,先是看到腾讯云有免费证书申请,有效期1年,不错,用上了,后来发现使用 Certbot 这个证书,虽然有效期短,但是可以通过程序自动更新,保证了证书有效期的持续性。本文就是使用 Certbot 生成证书的方法。
Let’s Encrypt 及 Certbot 简介
Let’s Encrypt 是 一个叫 ISRG ( Internet Security Research Group ,互联网安全研究小组)的组织推出的免费安全证书计划。参与这个计划的组织和公司可以说是互联网顶顶重要的先驱,除了前文提到的三个牛气哄哄的发起单位外,后来又有思科(全球网络设备制造商执牛耳者)、 Akamai 加入,甚至连 Linux 基金会也加入了合作,这些大牌组织的加入保证了这个项目的可信度和可持续性。
尽管项目本身以及有该项目签发的证书很可信,但一开始 Let’s Encrypt 的安全证书配置起来比较麻烦,需要手动获取及部署。存在一定的门槛,没有一些技术底子可能比较难搞定。然后有一些网友就自己做了一些脚本来优化和简化部署过程。
后来 ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot ,利用它可以完全自动化的获取、部署和更新安全证书。这真是非常容易、方便呀,所以我们就可以直接使用官方客户端,不需要再使用第三方的工具了。虽然第三方工具也可以使用,但是官方工具更权威,风险也更小,而且遇到问题也更容易解决,毕竟有官方的支持。何况 Certbot 确实非常方便,也比所有的第三方工具都更方便,何乐而不用呢?
Certbot 下载与安装
1. 下载
首先我们去 Certbot官网 下载对应自己服务器的脚本,我这里选择的是 Nginx 和 Centos 6
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
2. 生成证书
根据官网的步骤,这一步就需要跟Nginx有关联了,届时Certbot会全自动的修改Nginx配置,并完成重启,这也就是通俗说的一键安装,而我又是不喜欢别人碰我得配置文件,所以这里我不需要Certbot帮我修改Nginx配置文件
./certbot-auto certonly --webroot --email admin@example.com -w /usr/root -d yulaiz.com -d www.yulaiz.com
中间会有一些自动运行及安装的软件,不用管,让其自动运行就好,顺利完成的话,屏幕上会有提示信息。
注意:由于Certbot的免费性质,所以对于接口的每小时访问次数做了限制,我们可以在命令中增加 --staging
参数来访问他的临时服务器来进行验证
./certbot-auto certonly --staging --webroot --email admin@example.com -w /usr/root -d yulaiz.com -d www.yulaiz.com
这里还有一点需要主要,可能大家在网上找教程的时候会发现用的不是 --webroot
参数,而是使用 --standalone
参数,实际上这是Certbot的两种证书生成方式:
- standalone
Certbot 会自己运行一个 web server 来进行验证。如果我们自己的服务器上已经有 web server 正在运行 (比如 Nginx 或 Apache ),用 standalone 方式的话需要先关掉它,以免冲突。
-
webroot
Certbot 会利用既有的 web server,在其 web root目录下创建隐藏文件, Let’s Encrypt 服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。这里有官方说明 。并且需要在 Nginx 配置文件中支持访问:
# for LetsEncrypt location ~ /.well-known { allow all; }
证书生成成功后,会有 Congratulations 的提示,并告诉我们证书放在
/etc/letsencrypt/live/
中
3. 配置证书到 Nginx
现在证书已经生成了,只需要将 Nginx 配置的证书指向 Certbot 生成的证书即可
我们来了解一下存放证书目录的接口:
/etc/letsencrypt/archive/
目录保存了所有证书的真实证书文件。子目录名为证书名称。/etc/letsencrypt/live/
保存了所有证书的超链接,指向保存在archive中的真实证书。/etc/letsencrypt/renewal/
更新证书时需要的配置文件。所以 Nginx 只需要指向 live 目录中的证书即可,每次更新证书,live 目录中的证书都是指向的最新证书。
目录中一共有4个证书文件:
-
privkey.pem
:证书的私钥(PKCS#8格式) fullchain.pem
:包括了cert.pem和chain.pem的内容cert.pem
:服务端证书-
chain.pem
:浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书一般情况下
fullchain.pem
和privkey.pem
就够用了修改Nginx的
nginx.conf
文件中的ssl配置,并重启Nginx
server {
listen 443;
server_name yulaiz.com;
ssl on;
ssl_certificate '/etc/letsencrypt/live/yulaiz.com/fullchain.pem';
ssl_certificate_key '/etc/letsencrypt/live/yulaiz.com/privkey.pem';
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
}
4. 证书更新
现在我们的服务器证书已经是配置好了,请求网站时也能识别出https,并带着绿色的安全小锁,但是 Let’s Encrypt 签发的证书有效期只有 90 天,所以需要每隔三个月就要更新一次安全证书,虽然有点麻烦,但是为了网络安全,这是值得的也是应该的。
- 测试更新(没有在真的更新,只是在调用 Certbot 进行测试)
./certbot-auto renew --dry-run
测试结果中,开头有 Congratulations 的字眼就成功了。。。嗯
-
更新
./certbot-auto renew --quiet
--quiet
是静默更新的意思,不在终端中输出信息,需要在日志中查看
5. 一些补充
删除证书 ./certbot-auto delete --cert-name yulaiz.com
6. 补充更新(2018-7-17)
之前自己玩玩玩,然后折腾了一下,删了 /etc/letsencrypt/live
里面的目录(本意是删除证书,需要重新申请),但是删除之后发现删的不彻底,新建的证书生成为了什么-2之类的,导致用于更新证书关联的脚本和程序无法运行,就删了部分配置,修改了配置文件,现在90天过去,我发现更新的不科学,想来想去 certbot-auto
的证书目录反正是自动生成,索性直接将 /etc/letsencrypt
整个目录删除,重新运行证书生成,完成。
注意的是我只有一个域名,别删多了,导致 /etc/letsencrypt/live
目录下的其他域名证书丢失,并且确保还没超出每小时调用的次数限制。
发表评论
沙发空缺中,还不快抢~