没有开启HTTPS的网站都是耍流氓
Posted TraceException
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有开启HTTPS的网站都是耍流氓相关的知识,希望对你有一定的参考价值。
虽然网络安全是早已说烂的话题,但现在还是很多网站停留在HTTP阶段,也许无暇顾及用户数据安全,也许网站定位就没有必要做安全防范,但其实早在2015年,维基百科/Google/Facebook等国外网站巨头就联合呼吁所有网站使用HTTPS协议,用户数据虽然已经谈不上隐私保护,但最基本的HTTPS都不做的网站,无异于在互联网上公开耍流氓了。
前段时间悄咪咪做了个web 服务,涉及到https相关的开发/调试/上线等工作,总结一下。
本文结构:
什么是HTTPS协议
HTTPS加密原理
本地开发时如何部署https请求环境
免费的SSL证书
如果你只是想了解一下HTTPS概念和网络安全相关概念,看前两部分即可。如果你已经熟知HTTP相关知识,可跳过前两部分,我很乐意和你探讨具体开发实现中的技术细节。
什么是HTTPS协议
我们在浏览器里面访问的任何网址都是http:// 或者https://开头的,按照文本相似性原理,我们不难得出,https是在http基础上衍生而来。那么什么是http?
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
这是维基百科给出的解释,翻译成人话就是,HTTP是互联网上传输数据的一种通用格式,网站的服务器和我们手机/PC上,各种浏览器/app/客户端是由不同工种的码农开发的,为了让他们彼此之间协商好统一的格式传输文字/图片/音频/视频等数据,定了HTTP这种通用的协议。开发浏览器的和开发网站的人员不需要坐下来开会商量怎么把交换数据,他们按照HTTP协议的格式作为前提假设,去开发他们负责的内容,届时网站上线,输入网站网址,浏览器就能正确解析展示网站的内容。
HTTP发明出来之后,大家都很happy,整个互联网都可以高效快速的往前发展,但是后来出现了一个问题,网站和浏览器直接传输的数据按照HTTP的协议来做,并没有要求安全性,所有在网络上传输的HTTP协议下的内容都是明文的,也就是说,一个用户如果在这种模式下登陆一个网站,他把用户名和密码通过HTTP协议发送给网站后台,这一路上会经过N个路由器转发,其中任何一个接收到这一串数据的点,都可以读到用户名密码,没有经过任何加密处理。(并不是说网站上,输入密码时,你看到的是黑点,那就别人真的都看不到……)
于是1994年,网景公司在HTTP协议基础上提出了一种加密传输数据的方式,来保证除了客户端和服务器之间,可靠的传输数据的方式,也就是HTTPS。
HTTPS加密原理
HTTPS加密的指导思想是,所有需要在互联网上传输的数据都要用非对称密钥加密,就像把要传输的数据放在一个盒子里,用锁锁起来,只有拿到钥匙才能打开盒子,拿到数据。非对称加密的思路是,设计一对密钥,可以给别人分享的密钥称为公钥(public key),这相当于带锁的盒子,可以发给别人用来锁数据,只能自己拥有的密钥称为私钥(private key),发出去的盒子,只有私钥可以打开。
这只是第一步,传输的数据本身会再做一次对称加密,对称加密设计更简单,只有一个私钥,数据用这个私钥加密也可用它来解密。类比上面那个例子,就是接收和发送数据的双方都有一把钥匙和同样的锁,大家都用这个锁把盒子里的数据锁起来,然后用同样的钥匙去打开,没有第三方有这把钥匙。
具体来说,用户访问一次网站的数据,加密解密的过程如下图所示:
这里有两点值得注意:
SSL证书。其实是个数字签名,都可以网站可以自己生成,但用户如何信任这个网站提供的数字签名,特别是对于没有计算机知识的用户,不了解签名使用的算法,难以凭借自己的判断来评估网站可信任程度。于是大家都依赖于CA认证机构颁发的证书,默认由CA机构认证盖章(Secured Seal)过的证书是可信任的,所以当访问一个没有接受过认证的SSL证书https网址时,浏览器会出现如下提示:
加密算法。整个传输数据过程中使用到的密钥都是通过某种加密算法计算得到的随机字符串,所以在网络上传输的数据外人看来是一串乱码,只有拥有密钥的一方可通过算法解析得到有意义的内容。那么所使用的算法是否够复杂,容不容易被破解复制就尤为关键,这一块涉及到密码学方面的知识,我也不甚了解,欢迎大家补充。
由于https协议的设计,与http相比,响应速度都较慢,原因有二:
建立数据传输通道时,来回的通信次数增多
加密解密需要时间
本地开发时如何部署https请求环境
在开发阶段,还没有必要在开发机上安装SSL证书,像常用的web framework都有debug模式在本地起服务,还没有到配置nginx/apache等server服务阶段,但因为web service如果开启https配置的话,就需要有一个环境让所有访问走https。这里推荐一个proxy工具stunnel ,原理是提供一个对外https的服务,将访问该服务的请求转发到另一个http的端口,示例配置如下:
pid=
cert = stunnel/stunnel.pem
sslVersion = all
options = NO_SSLv2
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8081
TIMEOUTclose=1
关键的两个配置是accept和connect,代表对内代理的端口和外部访问的端口,这个示例中,本地服务起在端口8081上,stunnel会连接这个端口,同时对外监听8443端口,假设服务器绑定的域名是www.example.com,那么客户端访问https://www.example.com:8443 就会将请求转发到8081端口。
这个工具不仅可以做本地调试的工具,对于原有的http服务,而没有办法转成https服务时,用stunnel转发可以作为一个暂时的解决方案,不需要改动代码。但有一点值得注意,如果服务内部要对request的url做判断的话,得到的url还是http的,无法当作https的url处理。
免费的SSL证书
自签名自然时免费的,当然也会被提示时不被信任的证书,由CA机构认证的证书大部分是收费的,根据域名类型(通配符型SSL证书、万能型SSL证书、单域名SSL证书、多域名SSL证书)和签名认证等级(DV SSL证书、IV SSL证书、OV SSL证书、EV SSL证书)收费标准各有不同,这里不再赘述,说说免费的信任证书。
国外的有Let's Encrypt(免费三个月)和StartSSL(貌似已经被Chrome弃用了),查了一遍没有特别合适的,国内的话各大云厂商都有提供,早先阿里云有一年免费的SSL证书,现在也取消了,都要收费,腾讯云可以申请到免费的,而且提供Apache/Nginx等几大主流服务器对应的配置(我绝对不是在打广告)。据说七牛等也可以申请到,没有试过。
另外还有个可以检查SSL证书安全性的网站,可以分析证书链完整性,签发机构,算法等信息,综合给网站安全性打分:https://www.ssllabs.com/index.html
最后提醒的一点是大家还是保持输入网址时,加上https的习惯,哪怕大部分网站都做了http到https的自动跳转,但当跳转这一步交给网站去做时也意味着钓鱼风险的存在。
往期精选
以上是关于没有开启HTTPS的网站都是耍流氓的主要内容,如果未能解决你的问题,请参考以下文章