大家好,又见面了,我是你们的朋友全栈君。
SSL协议主要是为了保证WEB通信的安全性,是基于TCP协议的
SSL协议有三个特性:
1.机密性
SSL协议的机密性主要依靠的是对称加密体质,在通信过程中,使用对称密码进行加密解密保证信息的安全性。
2.完整性
SSL协议的完整性主要依靠的是散列技术,对分组数据进行压缩之后,利用散列函数获得哈希值,加在分组信息的尾部,并且利用对称密码进行加密之后再传输(在传输到TCP层之前还有一个动作是增加记录头,SSL记录协议,之后会讲到)。然后接收方在接收到信息并且到达SSL层的时候先去除SSL记录协议头部,然后利用对称密码解密,之后去除压缩数据进行散列,比对尾部的散列值是否一样,若一样则证明数据没有改变。
3.认证性
SSL协议在握手的时候会用公钥证书来鉴别对方的身份。利用的是非对称加密体质中的公钥加密算法,这个时候是利用私钥来对身份信息进行加密,然后接收方再用公钥来进行解密,若是可以进行解密就证明对方是该证书的合法支持者,公钥证书是通过PKI(公钥基础设施,Public Key Infrastructure)来进行分发管理的。
SSL协议握手过程:
SSL协议握手过程分为两类:单向握手和双向握手,通信双方分别为Client和Server,这里的Client和Server不同于HTTP协议,区别在于发起SSL握手的定义为Client,以下暂且把它们称为客户和服务器。
1.SSL协议单向握手过程:
(1)首先客户像服务器先发送一个ClientHello的消息,开始了SSL握手的协商过程,这个消息主要包含了客户端的SSL的版本,随机数,回话ID,密码算法列表和压缩算法列表。
(2)此时服务端接收到消息,并且返回给客户端一个ServerHello的消息,和ClientHello的区别在于,此消息包含的是服务端选择的对称加密算法和压缩算法,而ClientHello的消息中包含的是算法列表。
(3)接着,服务端再发送给客户端一个Certificate的消息,该消息中就包含了公钥证书。服务端对公钥证书用私钥进行加密,然后发给客户端,客户端接收到消息,然后用公钥进行解密,如果解密得出来,则鉴别了身份,解密出来的公钥证书就包含了服务端的身份信息,这样客户端就能对服务端的身份进行鉴别了。
(4)之后,服务端再发给客户端一个ServerHelloDone的消息,结束握手协商的第一步,当服务端接收到该消息时服务端就知道不会再接收到之前的消息。
第一阶段的身份验证和加密算法的协商完成之后,接着开始第二阶段:回话密钥的协商:
(5)此时,客户端会发给服务端一个ClientKeyExchange的消息,其中包含了会话密钥的相关信息。
(6)然后,客户端再发给服务端一个ChangeCipherSpec的消息,告诉服务端,之后的消息都会用之前协商好的会话密钥进行加密。
(7)接着,客户端发给服务端一个Finished的消息,此时的消息是通过会话密钥进行了加密的,服务端利用该消息来验证SSL握手协商是否正确。
(8)之后,服务端发给客户端一个ChangeCipherSpec的消息,告诉客户端之后的消息会用刚才协商好的会话密钥进行加密。
(9)最后,服务端同样会发给客户端一个Finisher的消息,让客户端来验证SSL握手协商是否正确。
握手过程完成之后,就开始传递信息了。
2.SSL协议双向握手过程:
双向握手和单向后手的区别就在于多了服务端对客户端进行身份认证的过程,具体的过程如下,红色为改变的地方:
(1)首先客户像服务器先发送一个ClientHello的消息,开始了SSL握手的协商过程,这个消息主要包含了客户端的SSL的版本,随机数,回话ID,密码算法列表和压缩算法列表。
(2)此时服务端接收到消息,并且返回给客户端一个ServerHello的消息,和ClientHello的区别在于,此消息包含的是服务端选择的对称加密算法和压缩算法,而ClientHello的消息中包含的是算法列表。
(3)接着,服务端再发送给客户端一个Certificate的消息,该消息中就包含了公钥证书。服务端对公钥证书用私钥进行加密,然后发给客户端,客户端接收到消息,然后用公钥进行解密,如果解密得出来,则鉴别了身份,解密出来的公钥证书就包含了服务端的身份信息,这样客户端就能对服务端的身份进行鉴别了。
(4)然后,服务端会发给客户端一个CertificateRequest的消息,请求对客户端进行身份验证。
(5)之后,服务端再发给客户端一个ServerHelloDone的消息,结束握手协商的第一步,当服务端接收到该消息时服务端就知道不会再接收到之前的消息。
第一阶段的身份验证和加密算法的协商完成之后,接着开始第二阶段:回话密钥的协商:
(6)接着,客户端会发给服务端一个Certieficate的消息,这个消息包含了一张或多张符合X.509标准的公钥证书和公钥证书链,用于服务端对客户端的身份鉴别。
(7)此时,客户端会发给服务端一个ClientKeyExchange的消息,其中包含了会话密钥的相关信息。
(8)之后,客户端发给服务端一个CertificateVerify的消息,该消息包含了一个用客户端私钥签名的会话信息,服务端使用客户端的公钥验证该会话信息是否正确
(9)然后,客户端再发给服务端一个ChangeCipherSpec的消息,告诉服务端,之后的消息都会用之前协商好的会话密钥进行加密。
(10)接着,客户端发给服务端一个Finished的消息,此时的消息是通过会话密钥进行了加密的,服务端利用该消息来验证SSL握手协商是否正确。
(11)之后,服务端发给客户端一个ChangeCipherSpec的消息,告诉客户端之后的消息会用刚才协商好的会话密钥进行加密。
(12)最后,服务端同样会发给客户端一个Finisher的消息,让客户端来验证SSL握手协商是否正确。
(第一次写博客,还请大家多多指教,)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141654.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...