网络模型分为7层,应用层,表现层,会话层,传输层,网络层,链路层,物理层,每一层有很多不同的协议。

http:属于应用层的协议,负责的是数据以什么结构传输也可以说成是打包成什么样子

SSL/TLS:属于应用程协议,同样是负责数据打包成什么样子(主要侧重于数据加密,TLS 算是SSL的后续版本所以通常放在一起说)

tcp:属于传输层,负责的是传输的通道建立

ip:并没有这么一个协议,通常说的ip说的是IPv4,IPv6,属于网络层,负责寻址

https:并不是某个单独的协议,(全称Http on TLS)其实是2个协议的组合应用

这里说到每一层其实都还有其他协议,例如传输层还有udp,应用层还有ssh等

 

这里有一个概念需要了解,数据在网络上传输并不是直接到达接收方的。而是经过了很多次的跳转以后才能达到。这个过程叫做路由。

这里由于这里经过了很多中间过程。就存在数据在某个中间过程点上被劫持。

为了保证中间过程没有被劫持数据没有被篡改,就引入了互相验证的过程,通常采用双向不对称加密的方式来验证,算法通常为RSA。

基于RSA这种加密算法发展出了,SSH,SSL/TLS这两种协议,SSH和SSL/TLS的协议验证的方式,个人认为的主要区别就是SSL/TLS更通用。因为他引入了数字证书同时也就引入了CA这么个机构。

具体的验证方式也就是比SSH多了最开始先验证“证书是否是CA颁发的合法证书”的这个流程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

发送方任何一个请求从发出到接收方接收到,都是经历了网络的7层的流程。每一层都按照对应协议包装,当然最后都是通过物理层(网线,电缆,光纤)到达服务器。

发送方打包:

具体数据>应用层>表现层>会话层>传输层>网络层>链路层>物理层

接收方解包:

物理层>链路层>网络层>传输层>会话层>表现层>应用层>具体数据

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCP负责建立通道:

这里所谓的建立通道指的是客户端和服务器已经做好了接受对方数据的准备,所以这里是一个所谓的概念上的通道(这里要明确,建立通道的数据传输依然是要经过上述的的7层包装传递的)。

这段是从百度百科上的说明:

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( 1MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我们通常说的http的3次握手,其实指的是tcp的3次握手。也就是这个过程基于tcp协议实现的。

我们的http数据传送是基于通道建立已经成功的基础上。所以必须先通过一个握手的过程来建立通道。

握手的过程(传输层按tcp协议打包):

1.客户端发syn包:应用层向传输层发送数据流,这个数据流里面包含内容为:一个SYN标识和一个数字,

2.接收方确认:接收方收到这个包解析以后看到SYN标识就知道了客户端是要建立连接。这时就会把客户端发过来的这个数字加1,然后带上一个自己的数字,发送返回包给客户端。

3.客户端确认接收方并准备以及接收方确认客户端已准备:客户端收到返回的包以后看到自己发过去的数字已经被加了1,说明服务器以接到自己请求,这个时候把服务器发过来的数字也加1,发包给服务器并且自己做好准备。

4.服务器看到自己返回的数字也加了1,说明客户端也已经准备好了,此时自己也做好准备。

握手完成(这个过程发了3次包所以被称为3次握手)。

这里服务器为什么不实在第2步就做好准备的原因是因为服务器资源有限。必须要客户端做好准备以后再准备,不然很有可能自己做好了准备,客户端那边没接到自己的响应导致没有做好准备

 

挥手的过程(传输层按tcp协议打包):

与握手过程相似只不过包内的标识为fin,并且服务器向客户端发送的时候ack和fin是分为开为2步发送(上面的百科说明tcp协议是支持数据打成多个包的)。至于为什么要分两步发,因为通道时双向通信的,很有可呢客户端提出关闭的时候服务器这边还有数据没发送完,所以先返回一个ack告诉客户端已经收到,数据发送完以后再告诉客户端已经发完了可以关闭了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

通道建立以后。

接下来传输数据。传数据的时候我们根据输入的url来分辨是用http还是用https。如果用的是https。 这个时候就牵涉到SSH,SSL/TLS了。

在使用http协议组织数据之前。要先保证刚才建立的通道是否是安全的,一旦确定了通道安全,就可以开始传递加密的数据了,这时候再来劫持就已经晚了。劫持到也解密不出来。

所以只要保证协商加密的这个步骤安全就行。所以这里就在传输数据之前协商加密的时候,加入了证书认证的这个过程。

证书认证的底层逻辑就是双向不对称加密,公钥可以很多,私钥只有一个。私钥可以解密所有公钥加密的内容,所有公钥都可以解密私钥加密的内容。但是公钥之间不能互相解密。

(私钥自己保留,公钥给到调用方)

此时的验证的过程是:

       1.请求方发起请求

       2.服务器将自己的内容取摘要(Hash)并将摘要的内容用私钥加密以后生成一个数字签名附加到内容的最后返回

       3.请求方拿到响应以后用前面拿到的公钥解密签名

       4.解密签名拿到摘要的hash值后,用同样的算法对服务器返回的内容部分取hash值并比较结果

       5.如果第4步解密失败,说明自己的公钥不是服务器持有的私钥对应的公钥;如果第4步比较结果不想等,说明内容被篡改过

这也就是SSH的过程。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SSL\TLS 相比于SSH引入了证书。TSL相当于是高版本的SSL(是SSL3.0的后续版本)。

 

运用以上原理,数字证书就诞生了。

证书由CA颁发或者由自己签发,这里的签发者我们称为Issuer 

所谓的签发就是由Issuer用自己的私钥,对要签发的目标的的信息以及签发目标的公钥进行签名(RSA加密)

所以证书包括签发目标的信息以及一个CA的签名

例如:A机构取找CA买了一个证书

A机构需要向CA机构提供自己的域名等公开信息信息,并提供一个公钥,然后CA证书中心用CA的私钥给 A提供的公开的信息,A提供的公钥,A的证书信息(CA机构设置) 加密生成数字证书并进行签名。

所以证书的内容包含

       1.A机构的一些公开信息

       2.CA机构的签名。

所以当请求方向A机构发送请求的时候A机构返回的信息里面包括了 信息本身,A机构对信息取摘要以后用自己的私钥加密出来的签名,以及一个数字证书(这个数字证书里面包含A的公钥)

当请求方接到服务器的响应以后会用CA的公钥取把 这个证书解密,然后拿到A的公钥,然后就是SSH的过程了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

为什么还需要CA

这里就要说到,中间人攻击,  就是有人可能冒充服务器,并给了一个请求方一个假服务器生成的公钥。SSH的就无法避免这个问题。

比如我拿到的公钥是B用自己的私钥生成给我的,然后B劫持了我的网络,假装成A给我发消息,我作为请求方 ,我并不知道我这个公钥是B的。

 

为了解决这个问题。就有了CA(certificate authorities)

 

CA签名是为了保证证书的颁发机构是可靠的。

在不手动指定公钥的前提下,这里如何知道应该用哪个公钥去对这个签名解密,这里是根据证书上的Issuer来确定的,而当前可能本机没有添加该Issuer的公钥到本机的信任列表,那么这种情况下怎么办:

这里就要涉及到一个证书链的问题,

而为什么会有证书链,这里CA又牵涉到一个分级的问题。因为CA是分级的。CA机构有很多,但是最顶层的CA只有固定的几个。通常证书都是由下级的CA颁发的。而下级CA颁发的证书里面其实是包含上一级CA的信息的(将上一层的CA信息以及签名信息以及公钥继续用自己的私钥签名)。最低级的CA颁发的证书解开以后会包含上一级CA的信息,这里又可以继续解析上一层CA的信息。解析过程相同(公钥解密,确认摘要),然后一直解析到最顶层。

 

在证书链的任意一级在请求方被加入的信任的列表,就表示可以验证通过,没有必要往下走,如果每一级都没有被信任那么只能一直找到最高级的颁发者也就是顶级CA的证书,如果依旧不被信任那就是验证不通过。

 

 

 

当这些步骤完成了以后,才轮到解析服务器的签名。

(顶级CA的证书被称为Root Certificate,下级CA的证书被称为InterMediate Certificate,最终用户的被称为End User Certificate)

所以SSL/TLS是先解析CA的证书(通过证书链),CA的验证通过。 在进行服务器本身的验证。所以SSH,SSL/TLS其实原理是一样的。

这里除了验证的过程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在证书传递的过程里面其实还有协商加密方式,协商压缩方式,以及协商密钥,这个密钥是真正数据发送时使用对称加密的密钥。

这个完整的过程叫做TLS握手,具体流程是

客户端发送请求包里面含有支持的 SessionId(如果有),SSL/TLS版本,压缩方式,加密组件。以及一个随机数字A。

服务器挑选一种压缩方式,加密套件,附带上证书并且也产生一个随机数字以后发送返回包给客户端,这里产生的这个随机数为B。

客户端验证证书,验证通过以后,根据前面传输的所有内容,产生第三个数字PreMaster,然后用A,B,PreMaster三个参数算出数据传输对称加密的密钥trasnKey。然后发包给服务器告诉服务器这边验证好了,我们的通道是安全的,可以开始数据传输了。服务器这个时候根据之前传输的内容也可以算出同样的trasnKey,然后双方就可以开始以trasnKey互相传输数据。

TLS握手完成。

在然后就是http 的传输了。

 

两篇解释https很好的文章

https://blog.csdn.net/ly131420/article/details/38400583 

http://www.youdzone.com/signature.html

 

这里有个图画的非常好

https://blog.csdn.net/qq_38425803/article/details/106730288

posted on 2018-11-15 14:08  风灵ARCHER  阅读(640)  评论(0编辑  收藏  举报