把你的网站升级到 HTTPS

把你的网站升级到 HTTPS

作为一个普通用户,在使用手机浏览网页,或是阅读微信中别人分享的内容时,经常会看到屏幕下方有个弹出广告,什么点击领红包啦,免费送流量啦,或是移动运营商的广告。通常这些广告跟你浏览的网站本身风格完全不搭、画质又非常糟糕、而且在几个毫不相干的网站中都出现了。遇到这样的情况,基本可以肯定是有中间人劫持了你的流量,并篡改了网页内容,在其中嵌入了广告。纯粹做做广告已经算是客气,更恶劣的可以替换你浏览的网页内容,把你引向钓鱼网站,甚至直接窃取你的密码。

作为一个开发者,你的境遇更糟糕,因为这一切时刻都发生在你自己的网站或 APP 上。也许是你花费不少心思才做出来的精美页面被一个很粗糙的广告拉低了好几个档次;也许是一个重要活动的报名按钮被广告遮挡,你的用户不得不先小心翼翼关了广告才能继续;也许是为一个大客户制作的严肃的内容下面出现了一段夸张又搞笑的广告语。

但最最糟糕的是,你的大多数客户和用户都不清楚这是运营商或广告商劫持了他们的流量,而是以为你这个家伙为了一点微薄的广告收入在里面嵌了品味低下的广告,毕竟这网站是你的,这应用是你开发的,不是你干的还能是谁呢。你是希望当这一切发生的时候向他们解释这不是你的错,还是从根本上杜绝这样的事情发生呢?更何况你不是一点错都没有,是你的安全工作没做到位,给了无良广告商机会,钱他们赚,黑锅你背。

换了过去,你还有借口,对网站进行 HTTPS(SSL/TLS) 安全加密的证书是要花钱买的,每个独立子域名就要几百元一年,高级的证书则需要几千上万。

不过现在有了 Let’s Encrypt。一个致力于推行互联网安全的非营利性组织,免费为你的网站进行认证并颁发证书,其颁发的证书已被各大浏览器广泛接受。

那么接下来就只剩一个问题了,到底怎么才能把自己的网站从 http 升级到 https 呢?

Let’s Encrypt 和 Certbot

Let’s Encrypt 颁发证书是完全自助的,如果你的网站已经上线运行,那么你只需要用它们提供的工具执行一个命令就能为其申请一个证书。

这个工具是 Certbot。

安装 Certbot
  • 打开 Certbot 的官方网站 https://certbot.eff.org/
  • 在 I’m Using 处选择自己使用的 Web 服务器和操作系统
  • 下方的内容会根据你的选择进行相应的变化
  • 根据网站给出的提示逐步操作

好吧,这个网站是英文的。

不过我简单总结了一下,主要是这两种方式:

首先尝试用操作系统对应的包管理器来安装,比如 ubuntu 用 apt-get install certbot, arch 用 pacman -S certbot,macOS 用 brew install certbot, centos 用 yum install certbot

如果提示包不存在,比如我用的 CentOS 6,那么可以尝试下载一个官方提供的叫做 certbot-auto 的脚本

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

如果使用 certbot-auto ,后续的命令中用到 certbot 的地方都换成 ./certbot-auto 即可。

获取证书
1
certbot certonly --webroot -w 网站根目录 -d 你的域名

将网站根目录和域名换成你实际使用的目录和域名即可。

certbot 会自动完成一系列的验证工作,把证书放在你的服务器上,然后弹出一个恭喜你成功获取证书的提示,证书文件的名称也包含在该提示中。通常会是 /etc/letsecrypt/live/你的域名/fullchain.pem

为你的网站启用 HTTPS

接下来就要修改你 Web 服务器的配置文件了,比如 Nginx 默认是修改 /etc/nginx/conf.d/default.conf

将配文件中的

1
listen 80;

改成

1
listen 443 ssl;

然后添加两行配置说明使用哪个证书文件

1
2
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;  
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;

重启 Web 服务器使证书生效。

证书续期

Let’s Encrypt 颁发的证书有效期为 90 天,你可以在证书快到期的时候进行续期操作,续期命令更加简单:

1
certbot renew

该命令会逐一检查你所有的证书文件,并对其中快到期的证书进行续期。

为了使续期后的新证书生效,重启一下 Web 服务器。

完整的例子

本来只是想写一篇如何在 CentOS 6 和 Nginx 下使用 Let’s Encrypt 为你的网站增加 HTTPS ,一不小心把题目写大了收不住。这个具体的例子,会涉及一些官方操作未提及的细节和问题,只好再另开一篇进行详细描述了。