相信大家在平时上网的过程中一定会发现,有些网站的域名前是http://但有些网站的域名前却是https://同样浏览网页,那为什么会出现这样的不同呢?
想要了解这个问题,我们就要先了解http的工作原理。
http协议,既作用在应用层的超文本传输协议。
顾名思义,http协议的作用就是服务器与客户端之间进行数据传输。这里传输的数据可能是文本,也可以是超越文本的,如图片,音乐,视频等数据。
如图:
客户端需要先与服务器建立tcp链接,在连接完成之后,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。两者之间采用超文本传送协议(HTTP)进行通信。由此可知,HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。
其请求报文如图:
那么http的通信过程我们就可以总结为:
(1)客户与服务器建立tcp连接;
(2)客户向服务器提出http 请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)在通信完成之后客户与服务器关闭连接。
但根据这个过程我们很容易发现,在客户端与服务器通信的过程中,无论是客户端的请求还是服务器的回应。两者的数据包在网络中都是未经任何加密的明文传输。也就是说如果两者的数据包在传输过程中被抓取,那么客户或者服务器的信息就轻易暴露了。
那么有没有办法保护这些通讯包呢?答案是肯定的,有问题当然就有解决方法。
这时我们就要用到https了。通过名称我们会发现其与http相比多了一个s,而这个s就是为http报文加密的协议(ssl/tls)
两者都是加密协议,但相比而言tls使用更多。所以我们着重了解一下tls
而想要了解tls就得先了解数据加密。在现有的加密方式中分为对称加密和非对称加密。
首先,我们来看对称加密,如图:
私钥与公钥成对的存在于会话双方,双方将自己的私钥与公钥混合发给对方。
在收到对方发送的私钥与公钥之后再与自己的私钥混合,这样便形成了只有会话双方知道的蜜钥。
接下来我们再看非对称加密,如图:
私钥与公钥都存在于服务器。当对话双方建立联系之后,服务器会将公钥发送给客户端,客户端就用公钥为数据加密。
服务器接收到之后用私钥解密,并用私钥加密数据回应客户端,而客户端则用公钥解密。
接下来我们来看tls的加密方式,如图:
在建立tcp链接之后,客户端会向服务器发送client hello包,其中包含tls版本,加密套件,以及产生的第1个随机数。
当服务器收到之后会回复server hello包,其中包含自己的tls版本,加密套件和第二个随机数
同时会发送certificate server key exchange server hello done
客户端收到以后发送用公钥加密后的第三个随机数
当服务器成功解密,同意之后便会话双方便使用还加密方式进行加密。
形成加密会话之后就成为了http的进阶版https。