面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵
这段时间毕竟也是 “金九银十” 的面试的黄金季节,阿粉当然也想去面试,但是因为自身受限,所以只能采访一下出去面试的同学们都问了什么内容,其中有一个,阿粉觉得有必要给大家分享一下,就是问关于 HTTP 的内容。
HTTP
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP 是基于 TCP/IP 协议通信协议来传递数据(HTML 文件、图片文件、查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
这其实就是百度百科里面的精简化的内容,虽然说不上太细致,但是已经算是对HTTP做了一个大概的描述,我们接下来就从以下的几个方面来看一下这个HTTP吧。
我们从这里就不再多解释 HTTP报文 和 主体 这些内容了,阿粉之前也是完整的给大家解释过了,包括了 HTTP 的进化历史,阿粉今天我们来讲讲 HTTP 和 HTTPS 的关系。
HTTP缺点
众所周知,HTTP 的优点那可是一大堆:
- 简单、灵活、易于扩展
- 应用广泛、环境成熟
- 无状态 (不需要额外的资源来记录状态信息)
但是 HTTP 的缺点也是非常的显著,为什么这么说,HTTP 使用的是明文的方式进行传输,虽然方便了我们的调试,但是信息会被暴露出来,每一个环节没有隐私可言。
而且 HTTP 在我们的认知当中,他就是一个不安全的,第一个原因是上面说的明文,还有就是 HTTP 不验证通信双方的身份,所以对方的身份有可能伪装,就像某些公共场所的那些 公共WIFI ,还有就是 HTTP 不能验证报文的完整性,所以报文也是有可能被篡改的。
基于这些内容,所以我们很多时候对 HTTP 的选择都比较慎重,不然你传输内容的时候,别人用抓包工具就很容易的能够分析出你想要传递的内容。
这时候我们就想到了一个事情,加密处理一下不就好了?
对,完全没问题,HTTP 没有加密的机制,但是我们可以想办法处理,这个办法就是:
SSL 或者 TLS
SSL: 安全套接层
TLS:安全层传输协议
当他们组合使用的时候,就能够加密 HTTP 的通信的内容了,这时候就能在这条线路上进行通信,而通过 SSL组合使用后的 HTTP 被称为 HTTPS 或者称之为 HTTP overSSL。
HTTPS
大白话说一下,HTTP 在加上加密处理和认证以及完整性保护之后就是 HTTPS。
分辨 HTTPS 最简单的方法就是,你在浏览器访问的时候,能够看到一个小锁的标识。
现在百分之90以上的网站不都是使用的 HTTPS 么,
我们使用抓包工具来看一下 HTTPS 的传输内容试试。
我们从中看到了TLS 的版本,还有阿粉没有截图上的随机数。
这时候我们就得来完整的分析 HTTPS 的安全通信机制了。来看个图看一下 然后我们再拿我们的抓包工具来进行分析。
上面这是 HTTPS 的安全通信的机制,我们分别来看看都干了什么。
第一步:Client Hello
客户端通过 发送 Client Hello 报文开始 SSL/TSL 通信。其中包含了 SSL/TSL 的版本,所使用的加密的方法等一系列的内容。
第二步:Server Hello
服务端根据客户端发送的支持的 SSL/TLS 协议版本,和自己的比较确定使用的 SSL/TLS 协议版本。缺点假面算法等内容。
第三步:服务器发送 Certificate 报文,报文中包含了公开密钥证书。
证书的目的实际上就是保证标识的身份,证书一般采用X.509标准。
第四步:Server Key Exchange
服务器发送 Server Hello Done 报文请求客户端,第一阶段的 SSL/TSL 握手协商部分结束。
也有很多人习惯的称第四步是 Server Hello Done 实际上当我们抓包的时候,发现他们是在一次请求中的,我们一会抓包看一下试试。Server Hello Done 实际上就是相当于我给你说我这边发完毕了。
第五步:Client Key Exchange
完成 SSL/TSL 第一次握手之后,客户端就发送 Client Key Exchange 报文作为回应,这里实际上就是为了交换秘钥参数,
这里客户端会再生成一个随机数,然后使用服务端传来的公钥进行加密得到密文PreMaster Key。服务端收到这个值后,使用私钥进行解密,这样两边的秘钥就协商好了。后面数据传输就可以用协商好的秘钥进行加密和解密。
第六步:Change Cipher Spec
客户端发送 Change Cipher Spec 报文,提示服务器编码改变,就是说以后我们再发消息的时候,我是用之前我们定义的密钥进行加密。
第七步:Client Finished
户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息,这一步也是比较关键的一步,这次的操作的成功与否,就得看服务器是否能够成功解密这次的报文来作为判断依据了。
第八步:服务器发送 Change Cipher Spec
第九步:服务器发送Server Finished 报文
实际上作用和 Client 差不多。
第十步:服务端和客户端的 Finished 交换完成了,这时候 SSL/TSL 的连接就OK了,发送信息也就是完整的称为 HTTPS 了。
最后就是进行数据传输的内容了。
既然 HTTPS 都是安全的了,为什么不大范围的广泛使用呢?
实际上加密通信虽然在一定程度上保护了数据的隐私,但是效率比较低,每一次通信都要加密,会消耗资源,如果包含一些钱的肯定那必须得使用加密的通信,而且主要证书要收费呀。
你要想用,那肯定需要证书,就像大家在做微信支付的时候,不是也需要购买证书么,一般一年怎么也得几百块钱,所以你知道 HTTP 和 HTTPS 的关系了么?
文章参考
《图解HTTP》
< END >
文章转载自公众号:Java极客技术