收藏官网首页
查看: 13585|回复: 0

[分享] SSL交互(握手)过程详解

13

主题

14

帖子

138

积分

注册会员

Rank: 2

积分
138
跳转到指定楼层
楼主
发表于 2017-2-8 18:06:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具

导读:双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书。 SSL 的英文全称是 “Secure Sockets Layer” ,中文名为 “ 安全套接层协议层 ” ,它是网景( Netscape )公司提出的基于 WEB 应用的安全协议。 SSL 协议指定了一种在应用程序协议(如 HTTP 、 Telenet 、 NMTP 和 FTP 等)和 TCP/IP 协议之间提供数据安全性分层的机制,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。


原文:http://www.cpplive.com/html/1387.html


普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,这显然是我们不希望看到的,尤其在跟用户名、密码、个人信息息息相关的通信过程(如网上银行交易、机密文件传输等等)尤其看重数据交互的隐秘性,所以我们常常用SSL协议来建立安全保密的通信,SSL协议能够保证交互双方的数据按密文方式传输,第三方在没有私钥的情况下几乎无法破解,从而到达保密的目的。究竟SSL是如何交互数据来确保安全的,很多人却不得而知,为了解答大家的疑惑,这里详细介绍一下SSL的交互过程。   

1、建立TCP连接

由于SSL协议依赖于TCP连接实施,所以在SSL交互之前需要先建立TCP连接。客户端connect服务端,服务端acccept客户端,经历三次握手以后TCP连接建立。

2、客户端发送SSL请求

客户端(Client)向服务端(Server)发送自身使用的SSL版本(SSL一共有三个版本)、加密算法的相关配置、随机数据以及其在在SSL协议中需要用到的信息。

3、服务端处理SSL请求

服务器(Server)反馈给客户端(Client)自己的SSL版本、加密算法的相关配置、随机数据以及用自己的私有密钥加密的SERVER-HELLO信息。服务端(Server)紧接着将自己的证书(包含公共密钥)传递过去。同时有个可选项目,即服务端(Server)可以要求客服端(Client)发送自己的证书。
4、客户端验证服务端身份

客服端(Client)用服务端(Server)传递过来证书验证服务端(Server)的身份,如果身份未验证通过则结束本次通信。证书验证通过后利用服务端(Server)的公共密钥尝试解开被其用私有密钥加密过的SERVER-HELLO信息,如果解开失败,说明该SERVER-HELLO必然是假的,故结束本次通信。

5、客户端发送公共密钥加密过的随机数据

客户端端(Client)生成随机数据(sharedsecret),并且把这个随机数据用服务端(Server)发送过来的的公共密钥加密,此次加密过程产生本次握手中的premastersecret(这个步骤是有可能有服务端的参与的,具体情况由他们使用的加密算法决定),然后将它(premastersecret)送回给服务端(Server)。如果服务端(Server)要求需要验证客户端(Client),那么客服端(Client)也需要自己把自己的证书(包含公共密钥)传递过去,同时送一些自己签过名(私有密钥加密)的数据过去。

6、服务端用私有密钥解密加密后的随机数据并协商暗号

Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商,得到mastersecret(可理解为premastersecret为双方协商的暗号,然后使用这个暗号再协商一个mastersecret用来产生真正的会话密钥用来传输数据)以此来保证数据的决对安全。

7、服务端跟客户端利用暗号生成加密算法跟密钥key

双方用mastersecret一起产生真正的sessionkey,这将是一个对称加密的key。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。

接下来双方就可以用协商好的算法和密钥key,采用对称加密算法来通信了。

8、一、前提        

1.对称密码:加密与解密都是一个密钥                 
                       表达公式:  Ek(P) = C  使用密钥k对P进行加密,得出密文C
                                        Dk(C) = P  使用密钥k对C进行解密,得出明文P                                                                                         k=k               
2.非对称密码:加密与解密不是同一个密钥,一个公共密钥(公钥)和一个私有密钥(私钥),经公钥加密的密文只能由私钥
                               解密,反过来,经私钥加密的密文只能由公钥解密
                       表达公式:  Ek1(P) = C  使用密钥k1对P进行加密,得出密文C                                   
                                       Dk2(C) = P  使用密钥k2对C进行解密,得出明文P                                   
                                      k1<>k2              
二、SSL通信理解
      1.客户端向服务端发出请求,服务端将公钥(以及服务端证书)响应给客户端
      2.客户端接收到服务器端端公钥与证书,验证证书是否在信任域内,不信任则结束通信,信任则使用服务端传过来的公钥生成一个"预备主密码",返回给服务端
      3.服务端接收客户端传过来的"预备主密码"密文,使用私钥解密。
        非对称加密的安全性也就在于此了,第三方无法获取到"预备主密码"的明文,因为除了服务端,其他任何人是没有私钥的。
      4.双方使用"预备主密码"生成用于会话的"主密码"。确认后,结束本次SSL握手,停止使用非对称加密。
      5.双方使用"主密码"对称加密传输数据,直到本次会话结束。  
      总结:先采用非对称加密模式,保证"主密码"只被通信双方获知,而后使用传统的对称加密方式通信,这样,保证了密钥安全(即"主密码")就等于保
证了数据安全。之所以建立安全连接后,转而使用对称加密,是因为非对称加密的运算量很大,用于常态的数据通信十分低效。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表