本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ
导语本文的目的,一是简要分析下对服务器身份验证的完整握手过程,二是证书链的验证,三是探索下iOS中原生库NSURLConnection或NSURLSession如何支持实现https。
一、HTTPSHTTPS是承载在TLS/SSL之上的HTTP,相较于HTTP明文数据传输方面所暴露出的缺点,HTTPS具有防止信息被窃听、篡改、劫持,提供信息加密,完整性校验及身份验证等优势。TLS/SSL是安全传输层协议,介于TCP和HTTP之间。TLS1.0是建立在SSL3.0规范之上的,可以理解为SSL3.0的升级版本。目前推荐使用的版本是TLS1.2。
TLS/SSL协议通常分为两层:TLS记录协议(TLS Record Protocol)和TLS握手协议(TLS Handshake Protocol)。 TLS记录协议建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。TLS握手协议建立在记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。除了这俩协议以外,还存在其它三种辅助协议: Changecipher spec 协议用来通知对端从handshake切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)。alert协议,用来通知各种返回码。application data协议,就是把http,smtp等的数据流传入record层做处理并传输。
想象一种场景:通常我们会访问HTTPS://xxx的网站,当你在浏览器地址栏输入支持HTTPS协议的URL地址后,服务器返回的数据会显示在页面上。对于不了解HTTPS协议工作原理的小伙伴可能觉得这个过程很简单:发送请求-服务器响应请求-结果返回并显示。但对于HTTPS而言,在整个发送请求返回数据过程中还涉及到通讯双方证书验证、数据加密、数据完整性校验等。
下面以登录qq邮箱为例,通过Wireshark抓包可以看到如下图:
在浏览器与服务器进行Application Data传输之前,还经历了Client Hello-Server Hello-Client Key Exchange-Change Cipher Spec等过程。而这些过程正是TLS/SSL提供的服务所决定的:
认证服务器身份,确保数据发送到正确的服务器;
加密数据以防止数据中途被窃取;
维护数据的完整性,确保数据在传输过程中不被改变。
上述单向验证的完整握手过程,总结如下:
第一阶段:ClientHello客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数random_C,扩展字段等信息。
第二阶段:ServerHello-ServerHelloDone如上图可以看出这个阶段包含4个过程( 有的服务器是单条发送,有的是合并一起发送)。服务端返回协商的信息结果,包括选择使用的协议版本,选择的加密套件,选择的压缩算法、随机数random_S等,其中随机数用于后续的密钥协商。服务器也会配置并返回对应的证书链Certificate,用于身份验证与密钥交换。然后会发送ServerHelloDone信息用于通知服务器信息发送结束。
第三阶段:证书校验在上图中的5-6之间,客户端这边还需要对服务器返回的证书进行校验。只有证书验证通过后,才能进行后续的通信。(具体分析可参看后续的证书验证过程)
第四阶段:ClientKeyExchange-Finished服务器返回的证书验证合法后, 客户端计算产生随机数字Pre-master,并用server证书中公钥加密,发送给服务器。同时客户端会根据已有的三个随机数根据相应的生成协商密钥。客户端会通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。然后客户端发送Finished消息用于通知客户端信息发送结束。
第五阶段:服务器端生成协商密钥服务器也会根据已有的三个随机数使用相应的算法生成协商密钥,会通知客户端后续的通信都采用协商的通信密钥和加密算法进行加密通信。然后发送Finished消息用于通知服务器信息发送结束。
第六阶段:握手结束在握手阶段结束后,客户端和服务器数据传输开始使用协商密钥进行加密通信。
总结简单来说,HTTPS请求整个过程主要分为两部分。一是握手过程:用于客户端和服务器验证双方身份,协商后续数据传输时使用到的密钥等。二是数据传输过程:身份验证通过并协商好密钥后,通信双方使用协商好的密钥加密数据并进行通信。在握手过程协商密钥时,使用的是非对称密钥交换算法, 密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。在数据传输过程中,客户端和服务器端使用协商好的密钥进行对称加密解密。
二、证书