网络协议
在讲解HTTP协议之前,我们先了解下什么叫网络协议。不同的硬件,操作系统之间通信,如何去寻找目标,哪方先请求通信,怎么去结束通信,这些问题都需要一种事先确定好的规则来解决,即网络协议。网络协议常见的有 FTP、DNS、HTTP、HTTPS、UDP、TCP、IP、ARP、VLAN 等,分别位于应用层、传输层、网络层、链路层等,协议集合起来被称为 TCP/IP。当然现在有种说法,TCP/IP 指 TCP 和 IP 协议。
HTTP的问题
HTTP(HyperText Transfer Protocol,超文本传输协议)位于应用层,是为了解决文本传输问题而出现。协议规定报文字段、状态码等,且通信仅由客户端发起。其设计之初是为了共享文档和分享知识,但随着 Web 的高速发展,出现有以下问题:
- 通信是使用明文
- 不认证通信方的身份
- 无法证明报文的完整性
小飞:老婆,今晚我们做点有益身心健康的事情怎么样 老婆:害羞.jpg,你想干嘛 ——如果信息不加密,即如同在通信过程中裸奔
对称加密(共享密钥加密)
为了保证通信内容中敏感信息(密码,用户信息…)的安全,决定对通信内容进行加密。最先出现的加密方法是对称加密,用同一个密钥进行加密和解密。但如何安全的将密钥交给对方呢
小飞:老婆,我装B被别人打了,转10块钱到卡00给我看病 小强(拦截密钥,篡改):老婆,我被别人打住院了,转100块钱到卡11救命 老婆:好的,转了 ——密钥无法安全到达,身份无法确定,报文无法确定
非对称加密(公开密钥加密)
为了将密钥交给对方,出现了非对称加密,即通过公钥(私钥)加密,通过私钥(公钥)解密。公钥大家都可以知道,服务器将公钥发给客户端,客户端收到后,自己随机生成对称加密的密钥,用服务器的公钥来加密再返回给服务器,这样大家就可以用对称加密来传输数据了。但依旧有问题
小飞:老婆,我因为六亲不认的步伐又被人打了 老婆:等下,给你个公钥XX,你生成一个密钥,用公钥加密密钥返回给我再聊 小强(拦截公钥,篡改):等下,给你个公钥OO,你生成一个密钥,用公钥加密密钥返回给我再聊 小飞:好,@##%…… ——只要在第一次通信时拦截篡改公钥,身份验证和报文完整性问题依旧存在
HTTPS的诞生
HTTP协议受限已经无法解决这些问题,于是在应用层的HTTP协议之前加一层TLS协议(网景制定的SSL协议升级版,IETF主导),也就是HTTPS。通信过程中只有双方是无法确认身份的,那么需要引入第三方机构,且这个机构要让大家都信任。服务端将自身的域名、IP、公钥等交给第三方机构,第三方机构利用其私钥将服务器的公钥加密,并生产数字证书(如CA证书)。而第三方机构的公钥内置于浏览器或操作系统中,通过公钥解密验证数字证书,确定服务器身份。
以下为SSL握手流程:
- 客户端发送一个「ClientHello」消息,说明它支持的密码算法列表以及最高协议版本等必要的信息
- 服务器返回支持的SSL版本,加密算法列表,以及自己的证书等。如果客户端请求的资源需要认证,服务器请求客户端发送证书。
- 客户端首先验证服务器,如果认证失败,则断开连接,认证成功则执行下一步;
- 客户端发送pre-master secret(用服务器的公钥加密)和自己的证书(如果服务器需要验证身份)
- 服务器验证客户端,用自己的私钥得到pre-master secret,然后经过一系列步骤生成master secret。
- 客户端和服务器使用master secret生成对称密钥session key,之后传输的收据均使用session key加密解密。
- 客户端发送消息声明之后的数据用session key加密,并发送一条加密数据表明握手结束
- 服务器发送消息声明之后的数据用session key加密,并发送一条加密数据表明握手结束

上图来自《图解HTTP》
每条记录中数据和mac(指纹)均做加密处理。
- 保密性:传输的数据均是采用session key加密,保证了保密性;
- 真实性:双方握手时对对方的身份均有验证,因此可以保证对方的真实性
- 完整性:每部分数据均有mac(Message Authentication Code)验证,验证时计算数据的mac然后与接收到的mac比较,即可确定数据是否完整。
- 不可否认性:session key只有通信双方有,并且不在网络上传输,因此攻击者无法伪造使用session key加密的数据,所以具有不可抵赖性。
小飞和老婆终于可以安心在网络聊天了
缺点
- HTTPS协议由于各种加密解密,会加大CPU、内存等硬件资源的消耗
- 数据变大,增加网络负载,比起HTTP速度慢2~100倍
- 收费
结论
如果非敏感数据,可以采用HTTP
参考资料
- 《图解HTTP》
- SSL具体体现什么地方
- 什么是HTTPS协议?
