腾讯面试官问我:HTTPS 是怎么从 HTTP 转过来的?还好我早有准备

109 阅读6分钟

这段时间稍微整理了一下面试题,其中有一个,感觉有必要给大家分享一下,就是问关于 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》

好了,本篇文章就给大家分享到这里,觉得内容对你有用的话,记得支持一下哟!

如果你也喜欢编程,想好C/C++的话!如果你也想让自己成为一个具有真材实料的厉害的程序员,不妨从现在开始!

微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)