移动安全-iOS(三)

网络通讯

咱们知道无线传输的数据能被第三方轻易截获(如使用抓包工具Charles),若是未使用加密措施,可能直接暴露用户的各类关键数据,例如用户名,密码等。加入了SSL(Secure Socket Layer)子层实现的HTTPS协议可确保数据在网络上加密传输,即便传输的数据被截获,也没法解密和还原。html

http不使用SSL/TLS的HTTP通讯,就是不加密的通讯。全部信息明文传播,带来了三大风险。算法

  • 1 窃听风险(eavesdropping):第三方能够获知通讯内容。
  • 2 篡改风险(tampering):第三方能够修改通讯内容。
  • 3 冒充风险(pretending):第三方能够冒充他人身份参与通讯。

SSL/TLS协议是为了解决这三大风险而设计的,但愿达到:windows

  • 全部信息都是加密传播,第三方没法窃听。
  • 具备校验机制,一旦被篡改,通讯双方会马上发现。
  • 配备身份证书,防止身份被冒充。

互联网是开放环境,通讯双方都是未知身份,这为协议的设计带来了很大的难度。并且,协议还必须可以经受全部匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。浏览器

基本的运行过程安全

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,而后用公钥加密信息,服务器收到密文后,用本身的私钥解密。关于公钥加密法bash

可是,这里有两个问题。

(1)如何保证公钥不被篡改?服务器

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。网络

(2)公钥加密计算量太大,如何减小耗用的时间?session

解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。因为"对话密钥"是对称加密,因此运算速度很是快,而服务器公钥只用于加密"对话密钥"自己,这样就减小了加密运算的消耗时间。工具

所以,SSL/TLS协议的基本过程是这样的:

  • 客户端向服务器端索要并验证公钥。
  • 双方协商生成"对话密钥"。
  • 双方采用"对话密钥"进行加密通讯。

上面过程的前两步,又称为"握手阶段"(handshake)。

4、握手阶段的详细过程

"握手阶段"涉及四次通讯,咱们一个个来看。须要注意的是,"握手阶段"的全部通讯都是明文的。

客户端发出请求(ClientHello)

01 首先,客户端(一般是浏览器)先向服务器发出加密通讯的请求,这被叫作ClientHello请求。 在这一步,客户端主要向服务器提供如下信息

  • 支持的协议版本,好比TLS 1.0版。
  • 一个客户端生成的随机数,稍后用于生成"对话密钥"。
  • 支持的加密方法,好比RSA公钥加密。
  • 支持的压缩方法。

这里须要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,不然会分不清应该向客户端提供哪个网站的数字证书。这就是为何一般一台服务器只能有一张数字证书的缘由。

** 服务器回应(SeverHello)**

02 :服务器收到客户端请求后,向客户端发出回应,这叫作SeverHello。服务器的回应包含如下内容。

  • 确认使用的加密通讯协议版本,好比TLS 1.0版本。若是浏览器与服务器支持的版本不一致,服务器关闭加密通讯。
  • 一个服务器生成的随机数,稍后用于生成"对话密钥"。
  • (3) 确认使用的加密方法,好比RSA公钥加密。
  • 服务器证书。

除了上面这些信息,若是服务器须要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。好比,金融机构每每只容许认证客户连入本身的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

03客户端回应

客户端收到服务器回应之后,首先验证服务器证书。若是证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已通过期,就会向访问者显示一个警告,由其选择是否还要继续通讯。 若是证书没有问题,客户端就会从证书中取出服务器的公钥。而后,向服务器发送下面三项信息。

  • 一个随机数。该随机数用服务器公钥加密,防止被窃听。
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供服务器校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它之后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。 至于为何必定要用三个随机数,来生成"会话密钥",dog250解释得很好:

"不论是客户端仍是服务器,都须要随机数,这样生成的密钥才不会每次都同样。因为SSL协议中证书是静态的,所以十分有必要引入一种随机因素来保证协商出来的密钥的随机性。 对于RSA密钥交换算法来讲,pre-master-key自己就是一个随机数,再加上hello消息中的随机,三个随机数经过一个密钥导出器最终导出一个对称密钥。 pre master的存在在于SSL协议不信任每一个主机都能产生彻底随机的随机数,若是随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret做为密钥就不合适了,所以必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能彻底不随机,但是是三个伪随机就十分接近随机了,每增长一个自由度,随机性增长的可不是一。"
复制代码

此外,若是前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。

04 服务器的最后回应

服务器收到客户端的第三个随机数pre-master key以后,计算生成本次会话所用的"会话密钥"。而后,向客户端最后发送下面信息。

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供客户端校验。

关于数字证书

该证书包含了公钥等信息,通常是由服务器发给客户端,接收方经过验证这个证书是否是由信赖的CA签发,或者与本地的证书相对比,来判断证书是否可信;假如须要双向验证,则服务器和客户端都须要发送数字证书给对方验证;

数字证书是一个电子文档,其中包含了持有者的信息、公钥以及证实该证书有效的数字签名。而数字证书以及相关的公钥管理和验证等技术组成了PKI(公钥基础设施)规范体系。通常来讲,数字证书是由数字证书认证机构(Certificate authority,即CA)来负责签发和管理,并承担PKI体系中公钥合法性的检验责任;数字证书的类型有不少,而HTTPS使用的是SSL证书。 怎么来验证数字证书是由CA签发的,而不是第三方伪造的呢? 在回答这个问题前,咱们须要先了解CA的组织结构。首先,CA组织结构中,最顶层的就是根CA,根CA下能够受权给多个二级CA,而二级CA又能够受权多个三级CA,因此CA的组织结构是一个树结构。对于SSL证书市场来讲,主要被Symantec(旗下有VeriSign和GeoTrust)、Comodo SSL、Go Daddy 和 GlobalSign 瓜分。 了解了CA的组织结构后,来看看数字证书的签发流程:

数字证书的签发机构CA,在接收到申请者的资料后进行核对并肯定信息的真实有效,而后就会制做一份符合X.509标准的文件。证书中的证书内容包含的持有者信息和公钥等都是由申请者提供的,而数字签名则是CA机构对证书内容进行hash加密后获得的,而这个数字签名就是咱们验证证书是不是有可信CA签发的数据。

假设上图证书是由证书签发机构CA1签发的。

  • 接收端接到一份数字证书Cer1后,对证书的内容作Hash获得H1;
  • 从签发该证书的机构CA1的数字证书中找到公钥,对证书上数字签名进行解密,获得证书Cer1签名的Hash摘要H2;
  • 对比H1和H2,如相等,则表示证书没有被篡改。
  • 但这个时候仍是不知道CA是不是合法的,咱们看到上图中有CA机构的数字证书,这个证书是公开的,全部人均可以获取到。而这个证书中的数字签名是上一级生成的,因此能够这样一直递归验证下去,直到根CA。根CA是自验证的,即他的数字签名是由本身的私钥来生成的。合法的根CA会被浏览器和操做系统加入到权威信任CA列表中,这样就完成了最终的验证。因此,必定要保护好本身环境(浏览器/操做系统)中根CA信任列表,信任了根CA就表示信任全部根CA下全部子级CA所签发的证书,不要随便添加根CA证书。

通常操做系统和浏览器只包含根CA机构的证书,而在配置Web服务器的HTTPS时,也会将配置整个证书链,因此整个校验流程是从最后的叶子节点证书开始,用父节点校验子节点,一层层校验整个证书链的可信性。

Basic Constraint校验漏洞 那是否无论多少层均可以这样一直信任下去呢?理论上是可行的,但会遇到一个问题。假设我从可信CA机构购买了一张证书,使用这张证书签发的证书是否也会被操做系统和浏览器信任呢?明显是不该该相信的,由于我并非CA机构,假如我签发的证书也被信任的话,那我彻底能够本身签发任何域名的证书来进行伪造攻击。这就是著名的Basic Constraint校验漏洞,X.509证书中的Basic Constraint包含了这是否是一个CA机构,以及有效证书路径的最大深度(即,这个CA还可否继续签发CA机构证书及其签发子CA证书的路径深度)。但在几年前,包括微软和Apple都爆出了没有正确校验这些信息的漏洞。

Basic Constraint信息请看下图:

上图是Google Internet Authority G2的证书,该证书是个CA机构证书;路径深度为0,表示该证书没法再签发CA证书,只能签发客户证书(client certificate)。
上图是google.com的证书,这是个客户证书(client certificate),不可再签发子证书,因此由该证书签发的子证书是不会被信任的。

以上是我对TLS的学习, 主要参考文章

阮一峰:SSL/TLS协议运行机制的概述

MicroSoft TechNet: MicroSoft TechNet,

The First Few Milliseconds of an HTTPS Connection :The First Few Milliseconds of an HTTPS Connection

Transport Layer Security: en.wikipedia.org/wiki/Transp…

stackChange :How does SSL/TLS work?

Jaminzzhang :iOS安全系列之一:HTTPS