HTTPS协议的SSL握手过程

HTTPS定义

HTTPS常被定义为为HTTP over SSL,超文本传输安全协议。
以往HTTP通讯直接使用的明文传输,容易被人抓包,破解数据包,而HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。

HTTP的URL由“http://”起始且默认使用端口80,
HTTPS的URL由“https://”起始且默认使用端口443。

注意:

  • SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。
  • IETF机构将SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),从技术上讲,TLS1.0与SSL3.0的差别非常微小。

SSL 定义

SSL是一个介于HTTP协议与TCP之间的一个可选层,为数据通讯提供安全支持。SSL协议可分为两层:

  • SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
  • SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

如果用右边的TCP/IP协议来划分,SSL是属于应用层与传输层之间的协议,如果还是用OSI七层协议划分,SSL是属于表示层与会话层的。

image.png

SSL握手过程

SSL协议的大概原理就是通过公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

以下是SSL协议握手的一个主要过程,主要分为4个阶段。

  • SSL客户端(也是TCP的客户端)在TCP链接建立之后,发出一个ClientHello来发起握手,这个消息里面包含了
    -- Client支持的SSL协议版本;
    -- Client生成的随机数c1,稍后用于生成"对话密钥";
    -- Client支持的加密方法;
    -- Client支持的压缩方法;

  • SSL的服务器端会回应一个ServerHello,这个消息里面包含了以下内容
    -- Server确认使用的加密通信协议版本;
    -- Server生成的随机数s1,稍后用于生成"对话密钥";
    -- Server确认使用的加密方法;
    -- Server 的SSL证书。

  • Client收到服务器回应以后,首先验证Server的证书是否有效,如果没问题,从证书里面取出Server的公钥,然后发送消息给Server,包含以下内容
    -- Client生成的随机数c2,需要注意的是,这个随机数c2是经过Server公钥加密过的;
    -- 告知Server 握手结束

  • Server收到Client消息后,使用私钥解密Client发过来的第二个随机数,同时也会发送握手结束的消息给Client。

此时,client和server都持有3个随机数,客户端和服务端用商定的算法利用3个随机数生成一个对话密钥(session key),随后的通信就用这个密钥进行加密解密。之所以用3个随机数,因为证书是静态的,增加随机数可以使得密钥更加有随机性。SSL协议传输过程中,使用的是由相同的3个随机数生成的对话密钥(session key),而生成的规则是client与server商议好的算法,所以这个对话密钥(session key)是相同的,这个加密方法称为对称加密

中间人攻击

HTTPS通讯也不一定是绝对安全的,有可能会被人劫持,如路由,代理,防火墙,通常是中间人攻击。所谓中间人,就是攻击端欺骗服务端,伪造成客户端。反过来欺骗客户端,伪造成服务端。

简单过程如下

在SSL握手阶段,服务器向客户端发送公钥。
攻击者截获公钥,保留在自己手上。
然后攻击者自己生成一个【伪造的】公钥,发给客户端。
客户端收到伪造的公钥后,生成加密随机数C2发给服务器。
攻击者获得加密随机数C2值,用自己的私钥解密获得真密钥。
同时使用服务端的公钥生成一个新的C2随机数,发给服务器。
服务器用私钥解密获得假密钥。

中间人攻击一般发生在SSL握手协议中,协商密钥的时候(非对称加密阶段),中间人攻击的主要目的是要欺骗客户端,与客户端协商生成最后的对话密钥(3个随机数生成),这样客户端的数据经过这个对话密钥加密后,就可以被中间人轻易解密出来。所以中间人攻击必须得使用自己证书(包含公钥)进行握手,这样才能有自己的私钥解密出客户端发过来的随机数。

如果客户端与服务端会话初始化完成,开始进行数据通讯(对称加密阶段),想要完成中间人攻击是非常困难的。

防御中间人攻击的手段是做好证书的校验,一般来说,客户端收到了服务端下发的证书,对证书的颁发机构、有效期等进行严格校验(证书是验证服务端身份合法与否的唯一方式):

Charles抓包原理

Charles其实是扮演一个中间人的角色,就是上述的中间人攻击。客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
大概示例图如下


image.png

AFNetworking的证书校验逻辑

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    AFSSLPinningModeNone,
    AFSSLPinningModePublicKey,
    AFSSLPinningModeCertificate,
};
  • AFSSLPinningModeNone 默认值。当allowInvalidCertificates为YES时,客户端无条件信任服务器返回的证书,默认为NO,需要查询iOS包含的CA根证书列表进行校验。
  • AFSSLPinningModePublicKey 只验证客户端证书中包含的公钥,不验证证书的有效期等信息。
  • AFSSLPinningModeCertificate 不仅验证公钥,也会验证证书本身的有效期等信息

如果需要App进行抓包调试,一般需要设置Mode为AFSSLPinningModeNone。

对称加密与非对称加密

  • 对称加密
    加密端和解密端使用同样规则(简称"密钥"),这被称为"对称加密算法",对称加密最大的问题在于如何保存和传递密钥。在SSL握手的最后步骤,两端拿到的3个随机数,使用商定的加密算法统一生产的密钥,此时两端密钥是相同的,使用此密钥对数据进行加解密,然后传输,此过程为对称加密。

  • 非对称加密

加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种加密模式被称为"非对称加密算法"。RSA算法一直是最广为使用的"非对称加密算法",2048位的密钥极其安全。SSL握手过程,客户端使用服务端的公钥解密随机数,服务端使用私钥解密出随机数的过程就是非对称加密。

参考

http://www.nsfocus.net/index.php?act=magazine&do=view&mid=841
https://www.jianshu.com/p/9c52693a09dc
https://www.jianshu.com/p/405f9d76f8c4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容