程序员

http和https网络协议

2018-12-24  本文已影响0人  senpaiLi

上一篇文章,我主要梳理了一下http和https的异同,还有http的请求过程,一些属性的介绍。

这会让我们对网络请求过程有一个初步的了解,但是一般我们去面试,面试官是不会问这些技术性比较强的问题的,所以我们在梳理一下网络协议的握手、挥手机制,还有https的加密机制。

在了解握手和挥手的过程之前
相关概念:
SYN:synchronous建立联机
ACK:acknowledgement 确认
PSH:push传送
FIN:finish结束
RST:reset重置
URG:urgent紧急

http的握手

从第一次接触网络协议,我们就有些握手、打电话的印象,但是他们究竟是如何匹配到的呢?

首先我们已经了解到,握手过程是在传输层,由TCP协议完成的,具体流程如下:


握手流程

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手成功后,客户端就与服务端完成了连接,可以开始传送数据。

http的挥手

挥手过程,即断开连接的过程,同样是在传输层由TCP协议实现。

具体流程如下:


挥手流程

第一次挥手:客户端A发送一个FIN.用来关闭客户A到服务器B的数据传送

第二次挥手:服务器B收到这个FIN. 它发回一个ACK,确认序号为收到的序号+1。和SYN一样,一个FIN将占用一个序号

第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A

第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为序号加1

为什么握手是三次,挥手是四次?为什么挥手时,服务器不将ACK和FIN同时返回给客户端?
原因是TCP的全双工模式,接收到FIN意味着没有数据发送过来了,但是还可以继续发送数据。

https握手

我们知道,http的握手过程,其实就是TCP的握手过程。
https是基于http协议,所以也是要经过TCP三次握手过程,但是握手成功之后,也就是数据连接完成后,还要再做一次握手。

SSL握手的作用:
1、内容加密 建立一个信息安全通道,来保证数据传输的安全;
2、身份认证 确认网站的真实性
3、数据完整性 防止内容被第三方冒充或者篡改

SSL握手,将确立双方加密传输数据的密码信息:

SSL握手过程

1、客户端发起HTTPS请求,产生一个随机数

2、服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以是自己制作或者CA证书。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用CA证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。公钥给别人加密使用,私钥给自己解密使用。

3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等,还有一个随机数。

4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值,然后用证书对该随机值进行加密,生成一个Premaster secret。
即使证书有问题,客户端也可以选择接收不被信任的证书。

5、传送加密信息
这部分传送的是用证书加密后的随机值Premaster secret,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6、服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7、传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。

随机数:

第一个随机数由client生成,第二个随机数由server生成。

第三个随机数由client生成,使用server的公钥加密,并发送给server。第三个随机数即图中的Premaster secret。这个过程中,Premaster secret只有client和server知道,不会泄露。

然后client和server根据三个随机数生成一个session key,即接下来数据传输过程中用到的对称秘钥。

总结来说就是一共生成三个随机数,根据三个随机数创建一个对称加密的秘钥。前两个随机数可以被抓包拿到,但是第三个随机数已经使用非对称加密算法加密过,所以最终生成的秘钥是保密的。

总结
为什么HTTPS是安全的?
在HTTPS握手的第四步中,如果站点的证书是不受信任的,会显示出现下面确认界面,确认了网站的真实性。另外第六和八步,使用客户端私钥加密解密,保证了数据传输的安全。

为什么要用对称加密进行数据加密,因为对称加密速度更快,对于用户传输的大量数据有明显的提升。

https的单向认证和双向认证

单向认证 双向认证

总结一下:

1、单向验证中,如果是你客户端,你需要拿到服务器的证书,并放到你的信任库中;如果是服务端,你要生成私钥和证书,并将这两个放到你的密钥库中,并且将证书发给所有客户端。

2、双向验证中,如果你是客户端,你要生成客户端的私钥和证书,将它们放到密钥库中,并将证书发给服务端,同时,在信任库中导入服务端的证书。如果你是服务端,除了在密钥库中保存服务器的私钥和证书,还要在信任库中导入客户端的证书。

3、再次强调,使用单向验证还是双向验证,是服务器决定的。

4、https的验证过程,不管是单向还是双向,只有四步,网上很多关于https验证过程的文章中,写了来来回回七八上十步。要真是这样,访问一个https地址,时间全花在了交互上了。

拓展:

TCP/IP层次图 数据传输封装过程

阮一峰大神介绍 SSL加密过程
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

知乎大神关于Https的分析:
https://zhuanlan.zhihu.com/p/22749689

上一篇下一篇

猜你喜欢

热点阅读