iTimothy

为你的Blog快速开启https支持

我的Blog是基于hexo生成的纯静态页面,host在nginx server上。其实通过普通的http访问方式已经足够了,开启https纯属折腾,请叫我不折腾不舒服斯基。

提到https,不得不提到免费的StarSSL证书,之前也申请了用过一段时间,感觉申请和续期证书的步骤都比较繁琐。后来随着证书过期,遂放弃之……

最近,在网上火透半边天的,非 Let’s Encrypt 的免费SSL证书莫属了。Let’s Encrypt 是一个将于2015年末推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书,同时,它还是免费、自动化、开放的证书签发服务。Let’s Encrypt的证书申请和续期都非常方便,默认的证书有效期是90天,通过cron的定时任务可以实现自动化的续期,所以,能通过自动的方式解决的问题都不是问题,这也是这次折腾起https支持的原因。此篇blog主要记录一下申请证书,配置证书到nginx,以及自动续期的实现步骤,供有兴趣的同学参考。

第一步 获取Certbot

Certbot 是一个简单易用的 SSL 证书部署工具,由 EFF 开发,前身即 Let’s Encrypt 官方(Python)客户端。简单来说,certbot 就是一个简化 Let’s Encrypt 部署,和管理 Let’s Encrypt 证书的工具。certbot的开源项目在GitHub上,所以,我们的第一步,是clone certbot项目到本地:

1
git clone https://github.com/certbot/certbot

第二步 申请证书

现在,可以通过脚本来申请证书了,以我的域名为例:

1
2
cd certbot
./letsencrypt-auto certonly -d www.xiaozhou.net -d xiaozhou.net

出现如下的证书申请与安装界面:

选择第二个选项,OK并继续。界面会提示证书申请成功的信息,表示证书已经成功生成。

需要注意的是,在申请证书之前,如果本机有运行Nginx,需要先停掉。并确认本机的443端口能被公网所访问

第三步 配置证书

申请好的证书,包含四个文件,默认会放在这里:

1
2
3
4
/etc/letsencrypt/live/www.xiaozhou.net/fullchain.pem
/etc/letsencrypt/live/www.xiaozhou.net/privkey.pem
/etc/letsencrypt/live/www.xiaozhou.net/cert.pem
/etc/letsencrypt/live/www.xiaozhou.net/chain.pem

有了这些证书文件,我们就可以去配置我们的Nginx了,实际上,我们用两个证书文件就行了,一个是带私钥的文件,一个是带公钥的文件。拿我的Nginx配置文件举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80 default; #默认监听80的HTTP端口;
listen 443 ssl; #确保Nginx监听HTTPS的443端口
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/www.xiaozhou.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xiaozhou.net/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /home/xiaozhou;
index index.html index.htm;
server_name xiaozhou.net www.xiaozhou.net;
}

配置好之后,直接用Nginx reload配置即可。

第五步 证书的验证

证书配置好了,我们就可以直接用浏览器通过https地址来访问和验证证书了,比如:https://www.xiaozhou.net

我们会看到地址栏的前面有一把小锁,嗯,咱是有证书的人了!

点击查看证书,还可以看到申请到的证书的详细信息,Let’s Encrypt签发的,货真价实:

第六步 证书的自动续期

最后一步,就是证书的自动续期了。Let’s Encrypt的证书,默认的有效期是90天,不过官方推荐每60天续期。到期之后,我们需要用命令来为证书续期,不过我们是懒人,这种体力活还是交给机器来完成比较合适。所以,我们可以用Linux的cron job来完成这类的任务,配置cron job,每两个月的第一天,执行下面的命令:

1
2
3
#minute hour day month day_of_week command
0 0 1 */2 * /letsencrypt/certbot-auto renew --post-hook "systemctl reload nginx"

注意在cron job里面需要用绝对路径

完结

简单的六步,我们轻轻松松的就申请了证书,并给blog开启了https访问,还给证书设置了自动续期,嗯,多亏了certbot这个工具,相比起当初申请StarSSL的各种繁琐,一切实在是来得太方便了。

支持原创技术分享,据说打赏我的人,都找到了女朋友!