在浏览一些网站时,网址左边会有“不安全”三个字,这时会不会担心这网站有病毒?其实没有那么恐怖,它的意思是,不要在这个网站输入敏感信息,因为数据传输过程不安全。
发现问题
虽然只是一个博客,但也得讲究一点用户体验。也许就因为这短短的三个字,网站就吓跑了不少人。更重要的是,网站档次下去了,本来辛辛苦苦做的博客,页面精美,内容丰富,结果看起来像山寨货。
相反,如果打开博客时,网址左边不是“不安全”,而是一把小锁,有没有安心很多?
找到原因
“不安全”指的是HTTP,小锁指的是HTTPS。
HTTP与HTTPS
你一定见过这两个词,每个打开的网址,前面都会自动加上http://,或者是https://,例如www.baidu.com打开后就变成了https://www.baidu.com。
为什么会自动加上它们?因为它们是协议,专门为浏览网站而设计出的协议,没有它,网站打不开。
那它们有什么区别?HTTPS有加密,HTTP没有。举个例子,浏览网站相当于两个人在房间里聊天,两人都讲普通话,如果有人在外面贴着门偷听,那就一听一个准,所以别以为对方是熟人,就说出银行卡和密码。可是,如果聊天时不讲普通话,讲自创的语言,别人就算听到了,也听不懂。“F42JR9(有内鬼,终止交易)”,“D09VC9(傻强,把货扔海里)”。
HTTPS比HTTP多出来的S,是指SSL(Secure Socket Layer,安全套接字层),或者TLS(Transport Layer Security,传输层安全),TLS是升级版的SSL。
HTTPS加密原理
先简单了解一下两种加密方式
- 非对称加密,公钥加密,私钥解密,更安全
- 对称加密,加密解密使用同一个密钥,更快速
好多名词,好枯燥,还是按照我的方式讲解。假设
- A找B充会员
- B有一个箱子,类似意见箱,东西可以往里放,但不能往外取,箱子的钥匙只有B一个人有
- B收到A充会员的消息后,把空箱子寄给了A
- A有一个盒子,盒子配有两把钥匙,盒子和箱子不同,它是全密封的
- A把这个盒子和其中一把钥匙,投进B的空箱子里,寄回给B
- B用自己的钥匙打开箱子,拿到了A的盒子和钥匙
- B用A的钥匙打开A的盒子,放进去一张纸条,“知道了这是付款二维码”,然后将钥匙留下,把盒子寄出去
- A收到盒子,自己也有一把钥匙,打开后看到了纸条,扫码付款
- 之后,A和B就一直用这个盒子交流
在这个过程中,所有消息都是放在盒子或箱子中进行传输的,非常安全,但细细一想,仍然有漏洞。假设
- 快递公司有个内鬼C,在中途劫取到盒子,想把付款二维码换成自己的
- 他发现自己做不到,因为他打不开盒子,他没有A和B手中的那两把钥匙
- C不气馁,他在A第二次充会员时,劫取到了A寄回给B的箱子
- 他想把箱子打开,把A的盒子和钥匙取出来,这样就有了钥匙,能打开盒子,往里面放自己的二维码
- 他发现自己做不到,因为他打不开箱子,他没有B手中那唯一的一把钥匙
- C不气馁,他在A第三次充会员时,劫取到了B寄给A的空箱子
- 他把B的空箱子换成另一个自己有钥匙的空箱子,再寄给A
- A把自己的盒子和钥匙投进空箱子,寄出
- C再劫取到箱子,拿自己的钥匙打开箱子,再拿里面的钥匙打开盒子,在盒子里放自己的二维码,寄回给A
- A扫码付款,钱到了C手上
从上面可以看出,唯一能出问题的点是,A不认识B的箱子,只要C伪造一个来欺骗A,A和B后面的对话就全被破解了。那怎样才能让A认识B的箱子?假设
- 警察局老大D,规定所有的箱子都必须办箱子证,办完后还要把证刻在箱子外面
- 箱子证上能看出,这个箱子是谁的,啥时候办的证,有效期是多久,以及D的亲笔签名
- 这样,所有人在收到箱子时,都能看出箱子是不是真的
箱子、盒子、箱子证,三样东西搭配起来,C就被饿死了。现在故事讲完了,回到正题HTTPS,没有人能保证信息在传输过程中不被监听,能保证的是,就算被监听,别人也无法破解,如果信息被篡改,我们一眼也能发现。箱子代表非对称加密的公钥,箱子钥匙代表非对称加密的私钥,盒子和盒子钥匙代表对称加密的密钥,箱子证代表CA(Certificate Authority,证书颁发机构)颁发的数字证书。附上一篇专业文章,深入揭秘HTTPS安全问题&连接建立全过程。
写到这里,有一点感慨,一个人要证明自己就是自己,得靠其他人或其他机构,所以人们都在办证。物品或许可以被定义,但是人不行,人的潜力无限
You’re not your job.
You’re not how much money you have in the bank.
You’re not the car you drive.
You’re not the contents of your wallet.
You’re not your fucking khakis.
You’re the all-singing, all-dancing crap of the world.
解决问题
办证要花钱,但CA不止一家,有一些能用到免费的,申请过程参考 Hexo博客之添加https。如果是用GitHub作空间,就不需要申请,因为GitHub已经买过了,HTTP和HTTPS都能访问。如果是用自己的服务器,申请之后还要修改Nginx的配置。配置的目的有两个
- 同时支持HTTP和HTTPS
- 访问HTTP时,自动跳转到HTTPS
直接上配置文件nginx.conf
1 | # For more information on configuration, see: |
修改后重启Nginx
1 | $ service nginx restart |
这时如果在服务器直接用curl localhost测试,会发现返回301,不要紧,用浏览器打开是能跳转的。另外,如果空间没备案,后期HTTP请求会被主机提供商拦截,但是HTTPS仍然能访问。