本人小记HTTPS

2017-06-29  本文已影响30人  劳达斯

What is HTTPS?

HTTPS = HTTP + SSL/TLS 。

SSL/TLS基于TCP,工作在OSI七层模型中的表示层,SSL不是简单地单个协议,而是两层协议:SSL记录协议和高层协议(SSL握手协议,SSL修改密码参数协议,SSL报警协议)。

HTTP与SSL/TLS协议组合使用的话,就可以加密HTTP的通信内容,解决HTTP通信不安全的问题。

怎样才是一次安全的通信?

所以,HTTPS需要做到:

HTTPS协议的主要功能基本都依赖于TLS/SSL协议,提供了身份验证、信息加密和完整性校验的功能,可以解决HTTP存在的安全问题。

本小记主要记录一下TLS/SSL协议的握手过程。

最复杂的地方:TLS/SSL握手

TLS握手主要可以分成三种流程:

单向验证握手过程:

握手过程图,来自腾讯Bugly:

image

详细步骤分析:

1.ClientHello:

客户端发起请求,这条消息将客户端的功能和首选项传送给服务器。包含以下信息:

1. 客户端支持的SSL的指定版本;
2. 加密组件(Cipher Suite)列表(所使用的加密算法密钥长度等);
3. 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;
4. 随机数 random_C(随机数:1/3 共3个,第1个),用于后续的密钥的生成;
5.  扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等;

抓包信息图片,来自腾讯Bugly:

ClientHello.png
2. ServerHello

ServerHello消息将服务器选择的连接参数传送回客户端。也就是服务端在客户端发送过来的加密组件列表压缩方法列表选择出了一种加密组件和压缩方法,发送回客户端确认,还有一个随机数 random_S (随机数 2/3)。

抓包信息图片,来自腾讯Bugly:

ServerHello.png
3.Server_Certificate 与 Sever_Hello_Done

服务器给客户端发送证书报文,报文中包含了一个公钥,这个公钥稍被在客户端用于加密一个随机数。报文中还有证书的签名信息,用于确认证书的合法性。(客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的签名信息,如果一致,则可以确认证书的合法性,即公钥合法;)除了公钥和签名,证书报文还包含了申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文。证书=公钥+申请者与颁发者信息+签名;

server_hello_done,通知客户端 server_hello 信息发送结束;

4.证书校验

客户端接收到服务器发来的证书报文,进行证书校验,合法性验证包括如下:

证书校验通过之后,继续下一步:

5. Client_Key_Exchange + Change_Cipher_Spec + Finished

此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥;
enc_key=Fuc(random_C, random_S, Pre-Master)

6. 服务端的ChangeCipherSpec + Finish
  1. 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master);
  2. 用这个刚计算出来的协商密钥解密客户端发送的 Finsh,验证数据和密钥正确性;
  3. 验证通过之后,服务器同样发送 ChangeCipherSpec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信;
  4. 发送Finsh;

最后客户端接收并计算所有接收信息的 hash 值,并采用协商密钥解密 Finsh,验证服务器发送的数据和密钥,验证通过则握手完成;

7.握手结束,开始使用协商密钥与算法进行加密的HTTP通信。

双向握手过程:

双向验证相比单向验证,多了一个验证客户端合法性的步骤。这个步骤有两条消息:

Android中的HTTPS

以OkHttp3.0为例

参考代码如下:

imageimage

先记到这,待完善。。。。

上一篇下一篇

猜你喜欢

热点阅读