笔者最近把博客网站升级到了https:www.rrfed.com,为何要升级呢?html
举一个最简单的例子,当我打开这个网页的时候:在网页的右下角会显示一个广告:python
可是这个网站是美国的:react
为何中国的广告会打到美国去了?而且不止一个网站有这个问题,本身的博客网站在我家打开常常也会有这个问题,常常会弹一些广告,这是为何呢?jquery
由于网站被运营商劫持了,它往你的html里面注入了一段广告的html,以下图所示:nginx
这个时候运营商就至关于一个中间人,以下图所示:数据库
这个我在《https链接的前几毫秒发生了什么》已经介绍过,不过不太同样的是,因为中间人的身份比较特殊,是运营商,因此它是在正常的链接上面的。也能够说因为运营商暗地里作了劫持,你也能够认为它不是一个正常的链接了。centos
无论怎么样,这种劫持也叫http劫持只发生在http链接上,而https的链接是没这个问题的,基本只要打开的是https的网页都不会被注入广告。由于传输的数据都是加密的,中间人收到的是一串没法解密的文本,它也不知道怎么篡改。浏览器
防火防盗防运营商,可是注入广告还算是小事,由于若是是http链接你的数据在网络上都是明文传输的,包括你的密码等敏感信息,你和服务器之间通过的路由均可以嗅探到你的数据,能够作些修改如嵌入一个广告,作一些破坏,或者只单纯的抓取信息如邮件内容、帐号密码等。因此使用https是颇有必要的,火狐会在非https的网页的密码输入框提示不安全:安全
Chrome/firefox等浏览器会在较明显的位置提示当前http网站不安全,只要点一下地址栏左边的i按钮就会弹出来:bash
而且https的网站可以提高SEO。
在外面连的公共wifi,使用https可以减小帐号信息被盗的风险,但也不是100%安全,由于它能够用其它的方式如在你的设备上种植木马等获取和控制你的帐号。
无论怎么样,搞一个https仍是颇有必要的,至少不要让别人觉得那个广告是你本身的网站打的。那怎么创建一个https的网站呢?我在《https链接的前几毫秒发生了什么》已经简单介绍过,须要购买SSL的证书,网上也有一些免费的证书。在某家证书购买机构能够看到证书的分类和价格:
证书分为三种dv(域名型)、ov(企业型)和ev(加强型),dv是最简单的只要有一个能够访问的域名就能够申请,而ov是给企业用的,申请比较严格须要提供企业的相关材料,ev能够在地址栏上显示公司的名字,如sitepoint.com。对于咱们这种小博客网站搞一个dv型的就能够了。
有一个免费的dv型证书颁发机构叫letsencrypt,它能够提供三个月的无偿使用,到期了再续一下就行,因此说它是免费的。并且安装和申请很是简单,使用certbot安装。下面简单介绍下安装过程:
先打开certbot的网站,选择你的操做系统,如笔者用的是centos + nginx:
而后它就会提示你怎么装了,先下载一个编译好的可执行文件:
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto复制代码
而后再执行安装的命令:
sudo ./path/to/certbot-auto --nginx复制代码
它会先安装一些python的包,以后会让你输入你的邮箱,而后自动去找你的nginx配置文件,找出里面的server的域名列出来,让你选哪一个要安装https证书:
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: www.rrfed.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
选好了以后它就会去申请证书,而后检验域名的合法性,若是报了链接超时的错误:
- The following errors were reported by the server:
Domain: trumporate.com
Type: connection
Detail: Timeout
那么极可能是防火墙iptables的443端口没有开放,只要把它和80端口同样开放一下就行了。
成功验证后它就会把SSL的证书下载下来,同时给nginx的添加ssl的配置:
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.rrfed.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/fed.renren.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot复制代码
还会提示是否要把http的重定向到https,若是选是的话,它就会添加如下nginx配置:
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot复制代码
301表示资源永久转移,浏览器收到301响应以后就会自动作重定向。
因为网站的不少图片的地址是http的已经固化到数据库里面,致使须要在https的网页里加载http的图片,这样即便是配了证书,浏览器也会提示不安全,浏览器地址样栏的小锁也没有了:
若是手动去改数据库会比较麻烦,有个比较简单的方法就是使用让http升级的meta标签:
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">复制代码
这样页面上全部的http请求都会强制变成https的请求。若是某些请求的服务器不支持https那这些请求就会挂掉,但我这个网站没有这个问题。
这样就愉快地把网站免费升级成https了:
在浏览器查看证书:
https升级后的问题是:加密和解密须要占用更多的CPU,而且加密后的数据会变大,可是据笔者观察加上gzip压缩以后,https传输的内容大小几乎和http同样。除了正常的tcp链接以外,还要创建ssl链接,这个时间通常在0.3s ~ 0.5s左右,这个是须要付出点代价的,可是因为浏览器左下角会提示用户“正在创建安全链接”,有一个缓冲的过程,因此其实还好。