🎉 网站自动 HTTPS 续期

10月 27, 2023 · 3 分钟阅读时长
blog

网站自动 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,就可以完成。

第一步:选择你的环境

  1. 打开 https://certbot.eff.org 网页
  2. 在机器图标下面,选择你用的 Web 接入软件操作系统(比如我选的是 Nginx + Ubuntu 14.04)
  3. 跳转到一个安装教程网页,照着做一遍就好了

第二步:安装 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 的。