http到https,https解决什么问题
报文为明文传输,存在被窃听的风险--ssl提供报文加密机制
无法判定通信方的身份,可能遭遇伪装--ssl的证书机制,需要请求方和服务端拥有相同的公钥证书
无法验证报文的完整性,可能已经被篡改--ssl的数字签名机制,MD5和SHA-1等散列值校验的方法
https本质上是将http通信接口部分使用ssl和tls协议替代,即原本http和tcp层直接通信,现在变为http先和ssl层通信,然后ssl和tcp层通信。
三种加密方法及其优缺点:
1对称加密--加解密使用同一秘钥
解密和加密用同一个秘钥的方式成为共享秘钥加密;
共享秘钥加密必须先将秘钥发给对方,这个时候如果通信被监听,那么秘钥可能落入攻击者手中,同时失去了加密的意义,另外需要安全保管接收到的秘钥。
2非对称(公开)秘钥加密--加解密使用不同的秘钥
公开密钥使用一对非对称的秘钥,包括一把公开秘钥和一把私有秘钥;发送密文的一方利用公开秘钥对报文加密,接收密文方则用私有秘钥对加密后的密文解密。
优点:私钥完全不用传输,所以很安全。
缺点:处理速度相对共享秘钥较慢。
3混合加密机制
使用混合加密的原因:非对称秘钥加密会比较慢,但是私钥不用传输安全,而对称秘钥方式则相反,为了充分利用两者优缺点,产生了混合加密机制
解决方案:即通信建立之初采用公开加密的方式传输对称秘钥方式中的同一秘钥,这样确保了共享秘钥的安全性,然后以后的通信均采用对称加密方式,这样提升了通信速度
https请求过程
https使用的是混合加密机制,其大概请求和处理过程如下图:
1、客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2、服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。
这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙(私钥)和一个锁头(公钥),只是全世界只有你一个人有这把钥匙(私钥),你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随机值(以后作为对称秘钥方式的共享秘钥),然后用证书(公钥)对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5、传送加密信息
这部分传送的是用公钥(证书)加密后的随机值,目的就是让服务端得到这个随机值(对称加密的秘钥),以后客户端和服务端的通信就可以通过这个随机值(共享秘钥)来进行对称加密解密了。
6、服务端解密共享秘钥
服务端用自己的私钥解密后,得到了客户端传过来的随机值(共享秘钥),注意这里对称加密的秘钥的传输方式采用的是公开秘钥方式,确保了共享秘钥的安全传输。然后以后的通信,都会采用对称秘钥方式将通信内容加密,即把内容通过该共享秘钥进行对称加密,所谓对称加密就是,将信息和共享秘钥通过某种算法混合在一起,这样除非知道共享秘钥和加密算法,不然无法获取内容,而正好客户端和服务端都知道这个共享秘钥,所以只要加密算法够彪悍,共享秘钥够复杂,数据就够安全。
7、传输加密后的信息
这部分信息是服务端用对称加密方式加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的随机值(共享秘钥)解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,因为没有共享秘钥也会束手无策。客户端之所以你能够正常解密是因为以下两点:
A服务端和客户端拥有相同的随机值(共享秘钥),是采用公开秘钥方式传输的。
B服务端和客户端使用相同的算法和随机值(共享秘钥)对内容进行加解密。
使用SPDY加快你的网站速度
2012年google如一声惊雷提出了SPDY的方案,大家才开始从正面看待和解决老版本HTTP协议本身的问题,SPDY可以说是综合了HTTPS和HTTP两者有点于一体的传输协议,主要解决:
- 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
- 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
- header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
- 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
- 服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。
SPDY位于HTTP之下,TCP和SSL之上,这样可以轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可以使用已有的SSL功能。
HTTP2.0的前世今生
顾名思义有了HTTP1.x,那么HTTP2.0也就顺理成章的出现了。HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下两点:
HTTP2.0的新特性
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。目前,有大多数网站已经启用HTTP2.0,例如YouTuBe,淘宝网等网站,利用chrome控制台可以查看是否启用H2:
参考:http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/