🎉 网站自动 HTTPS 续期
网站自动 HTTPS 续期
什么是 Let’s Encrypt
我用的是 Let’s Encrypt 这个免费的解决方案。Let’s Encrypt 是一个于 2015 年推出的数字证书认证机构,旨在通过自动化流程消除手动创建和安装证书的复杂过程,为安全网站提供免费的 SSL/TLS 证书。
这项服务由 互联网安全研究小组(ISRG – Internet Security Research Group,一个公益组织)提供。主要赞助商包括 电子前哨基金会、Mozilla 基金会、Akamai 以及 Cisco 等公司(完整赞助商列表)。
2015 年 6 月,Let’s Encrypt 得到了一个存储在硬件安全模块中的离线 RSA 根证书。这个由 IdenTrust 证书签发机构交叉签名的根证书被用于签署两个证书:
- 用于签发请求的证书
- 保存在本地的备份证书——在上一个证书出问题时启用
因为 IdenTrust 的 CA 根证书目前已被预置于主流浏览器中,所以 Let’s Encrypt 签发的证书从一开始就能被识别并接受,甚至当用户的浏览器中没有信任 ISRG 的根证书时也可以。
以上介绍文字来自 Wikipedia 的 Let’s Encrypt 词条。
安装步骤:Certbot 一键搞定
为你的网站安装证书十分简单,只需要使用电子前哨基金会 EFF 的 Certbot,就可以完成。
第一步:选择你的环境
- 打开 https://certbot.eff.org 网页
- 在机器图标下面,选择你用的 Web 接入软件 和 操作系统(比如我选的是 Nginx + Ubuntu 14.04)
- 跳转到一个安装教程网页,照着做一遍就好了
第二步:安装 Certbot
以Nginx + Ubuntu:
# 更新包列表
sudo apt-get update
# 安装必要工具
sudo apt-get install software-properties-common
# 添加 Certbot 的 PPA 源
sudo add-apt-repository ppa:certbot/certbot
# 再次更新
sudo apt-get update
# 安装 Certbot 的 Nginx 插件
sudo apt-get install python-certbot-nginx
第三步:运行 Certbot
sudo certbot --nginx
Certbot 会自动检查你的 nginx.conf 配置,把你所有的虚拟站点都列出来,让你选择需要开启 HTTPS 的站点。输入列表编号(用空格分开),Certbot 就会帮你下载证书并更新 nginx.conf。
第四步:查看 Nginx 配置变更
打开你的 nginx.conf 文件,你会发现 server 配置中被做了如下修改:
# SSL 证书配置
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
同时,Certbot 还会自动添加 HTTP 到 HTTPS 的 301 跳转:
# 将非 HTTPS 流量重定向到 HTTPS
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
进阶:开启 HTTP/2
这里建议配置 HTTP/2,要求 Nginx 版本大于 1.9.5。HTTP/2 具有更快的 HTTPS 传输性能,非常值得开启(关于性能可以看一下这篇文章)。
开启方法很简单,只需要在 listen 443 ssl; 后面加上 http2:
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
然后执行 nginx -s reload 即可生效。
自动续期:Crontab 定时任务
⚠️ Let’s Encrypt 的证书 90 天就过期了,所以你需要设置自动化更新脚本。最容易的莫过于使用 crontab。
方案一:每月强制更新
使用 crontab -e 加入如下定时作业:
# 每月 1 号凌晨 0:00 强制续期证书
0 0 1 * * /usr/bin/certbot renew --force-renewal
# 每月 1 号凌晨 0:05 重启 Nginx 使新证书生效
5 0 1 * * /usr/sbin/service nginx restart
方案二:每天检查(推荐)
每天凌晨 1 点检查一次,证书到期前 30 天才会真正续期:
# 每天凌晨 1:00 检查并续期
0 1 * * * certbot renew
Crontab 语法速查
Crontab 共六个字段:
| 字段 | 含义 | 取值范围 |
|---|---|---|
| 第 1 个 | 分钟 | 0 - 59 |
| 第 2 个 | 小时 | 0 - 23 |
| 第 3 个 | 日期 | 1 - 31 |
| 第 4 个 | 月份 | 1 - 12(12 代表 December) |
| 第 5 个 | 星期 | 0 - 7(7 或 0 代表星期天) |
| 第 6 个 | 命令 | /path/to/command |
💡 一个思考:这么方便的同时,如果是一些恶意的钓鱼网站也让自己的站点变成 HTTPS,这对于一般用户来说就有点难以防范了……
网站内容适配 HTTPS
在 Nginx 或 Apache 上启用 HTTPS 后还没有结束。因为你的网页中所有使用 http:// 的地方都要改成 https://,不然图片、JS、CSS 等非 HTTPS 的链接都会导致浏览器报不安全而被 block 掉。
总结
基本上就是这些事。希望大家都来把自己的网站更新成 HTTPS 的。