最新消息:

HTTPS是如何保障安全的-HTTPS握手过程分析

IT技术 ipcpu 3804浏览

HTTPS是如何保障安全的.md

零、引入

在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能。App Transport Security(ATS)是苹果在iOS 9中引入的一项隐私保护功能,屏蔽明文HTTP资源加载,连接必须经过更安全的HTTPS。

一、HTTPS概述

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。

二、HTTPS的历史

互联网诞生之初 SSL(Secure Sockets Layer 安全套接层)是由 Netscape 这家最早的浏览器公司设计的,主要是用于 Web 的安全传输的协议,这种协议在早期 Web 上获得了广泛的应用。后来被 IETF 标准化形成了 TLS(Transport Layer Security 传输层安全)标准,其历史如下:

1994: SSL1.0,因为存在严重的安全漏洞,未发布。
1995: SSL2.0,这个版本由于设计缺陷,很快被发现有严重漏洞,被废弃。
1996: SSL3.0,重新设计并开始流行,SSL 前三个版本都是由 Netscape 设计实现。
1999: TLS1.0,IETF 将 SSL 标准化,即 RFC 2246。
2006: TLS1.1,作为 RFC 4346 发布。
2008: TLS1.2,作为 RFC 5246 发布 。
2015: TLS1.3,尚在制定中,处于草案阶段。

如上,现在互联网世界使用最广泛的应该是 TLS1.2 标准。

三、HTTPS的目标和功能

最初的设计目标就是为了实现下面三个目的:

  • 身份认证:防止身份冒充。
  • 内容加密:第三方无法窃听。
  • 数据完整性:无法篡改。

四、HTTPS握手过程

4.1、客户端首次发出请求

客户端将自己支持的TLS协议、加密套件(Cipher Suite)的列表传送给服务端。除此之外,客户端还要产生一个随机数client_random。

客户端需要提供如下信息:

支持的协议版本,比如TLS 1.2版
一个客户端生成的随机数,client_random
加密套件列表,比如TLS_RSA_WITH_AES_256_CBC_SHA
要访问的域名hostname

4.2、服务端首次回应(Server Hello & Certificate Server Key Exchange & Server Hello Done)

服务端在接收到客户端的Client Hello之后,服务端需要确定加密协议的版本,以及加密的算法,然后也生成一个随机数server_random,以及将自己的证书发送给客户端。

服务端需要提供的信息:

协议的版本
加密的算法
随机数server_random
服务器证书

4.3、客户端验证证书(Client Key Exchange & Change Cipher Spec & Encrypted Handshake Message)

客户端验证服务器证书的合法性,证书合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;

客户端使用一些加密算法(例如:RSA,Diffie-Hellman)产生一个48个字节的Key,这个Key叫PreMaster Secret。该PreMaster Secret用服务器证书中的公钥加密传送。

客户端发送编码改变通知(ChangeCipherSpec),表示随后的信息都将用双方商定的加密方法和密钥发送。

客户端发送握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

本阶段发送内容

加密后的PreMaster Secret
ChangeCipherSpec
握手结束通知

4.4、服务器再次响应(Change Cipher Spec & Encrypted Handshake Message)

服务端在接收到客户端传过来的PreMaster Secret加密数据之后,使用证书私钥对这段加密数据进行解密,并对数据进行验证,也会使用跟客户端同样的方式生成秘钥(Master Secret和Session Secret),一切准备好之后,也会给客户端发送一个 ChangeCipherSpec,告知客户端已经切换到协商过的加密套件状态,准备使用加密套件和 Session Secret加密数据了。

之后,服务端也会使用 Session Secret 加密一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功。

需要注意的是,上面握手过程中存在三个Key(client_random, server_random,PreMaster Secret),而且服务器和客户端都保留着这三个值,客户端和服务端通过这三个值计算出同样的Master secret。

4.5、后续客户端与服务器间通信

确定秘钥之后,服务器与客户端之间就会通过商定的秘钥加密消息了,进行通讯了。

五、Master Secret的计算过程

在上一节中,出现了client_random、server_random、PreMaster Secret三个随机的KEY。

Master Secret的计算过程如下(客户端和服务端都会同时计算,结果也是一样的)

Master Secret和Session Secret是什么关系呢?

Master Secret的数据结构如上,其中Client write MAC key是客户端发数据的session secret,Server write MAC secret是服务端发送数据的session key。

MAC(Message Authentication Code),是一个数字签名,用来验证数据的完整性,可以检测到数据是否被串改。

六、加密套件Cipher Suite

常见的加密套件如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,其组成结构如下,

调整加密套件可以影响服务器的相应时间,但需要考虑各个平台兼容性。

七、参考资料

http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html
https://yq.aliyun.com/articles/47322
http://honglu.me/2016/01/13/HTTPS%E8%AF%A6%E8%A7%A3/
http://www.wxtlife.com/2016/03/27/%E8%AF%A6%E8%A7%A3https%E6%98%AF%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F/
http://www.lynahex.com/index.php/archives/how-https-works-2.html
《HTTPS权威指南》

转载请注明:IPCPU-网络之路 » HTTPS是如何保障安全的-HTTPS握手过程分析