最近参与的项目中,由于使用了自签名的Https,由于之前的项目中并没有接触过Https,所以在接入之后出现了一些问题。在进行网络请求的时候抛出了如下异常。
java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found
同时在使用WebView进行装载页面的时候,也出现了页面空白的问题。借此机会,准备对Https进行一个系统的学习。从为什么要使用Https,Https的实现原理,在Android中Https的应用。
为什么需要Https
-
内容劫持
上面的几个图,在平时我们使用手机的过程中是经常出现的一个现象。产生上述问题的原因是我们在数据传输的时候通过http进行传输导致了被运营商劫持,然后修改了其中的内容。
- 敏感数据
同时也会有一些个人开启wifi,然后对其中内容做嗅探,获取其中的敏感数据。为了提升用户体验,采用Https是一个不错的方式,相比于采用自己的协议方便很多。
补充知识
Https是什么?
HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。
HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。
SSL协议在通信过程中起了两个作用:
1、确保通信双方身份没有伪造,通过数字证书实现。
2、确保与服务器之间的通讯不能被第三方窃取、修改。
了解https通信过程还需知道两种加密方式:非对称加密和对称加密。客户端与服务器进行安全数据交互之前,需在非对称秘钥的加密保护下生成用于会话期数据加密的对称秘钥。
3.1 对称加密算法
对称加密是指:加密和解密使用相同密钥的算法。它要求发送方和接收方在安全通信之前,商定一个对称密钥。对称算法的安全性完全依赖于密钥,密钥泄漏就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。
3.1.1 对称加密又分为两种模式:流加密和分组加密
流加密是将消息作为字节流对待,并且使用数学函数分别作用在每一个字节位上。使用流加密时,每加密一次,相同的明文位会转换成不同的密文位。流加密使用了密钥流生成器,它生成的字节流与明文字节流进行异或,从而生成密文。
分组加密是将消息划分为若干个分组,这些分组随后会通过数学函数进行处理,每次一个分组。假设使用64位的分组密码,此时如果消息长度为640位,就会被划分成10个64位的分组(如果最后一个分组长度不到64,则用0补齐之后加到64位),每个分组都用一系列数学公式进行处理,最后得到10个加密文本分组。然后,将这条密文消息发送给对端。对端必须拥有相同的分组密码,以相反的顺序对10个密文分组使用前面的算法解密,最终得到明文消息。比较常用的分组加密算法有DES、3DES、AES。其中DES是比较老的加密算法,现在已经被证明不安全。而3DES是一个过渡的加密算法,相当于在DES基础上进行三重运算来提高安全性,但其本质上还是和DES算法一致。而AES是DES算法的替代算法,是现在最安全的对称加密算法之一。
3.1.2 对称加密算法的优缺点:
优点:计算量小、加密速度快、加密效率高。
缺点:
(1)交易双方都使用同样密钥,安全性得不到保证;
(2)每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信息双方所拥有的钥匙数量呈几何级数增长,密钥管理成为负担。
在非对称密钥交换算法出现以前,对称加密的最主要缺陷就是不知道如何在通信双方之间传输对称密钥,而又不让中间人窃取。非对称密钥交换算法诞生之后,专门针对对称密钥传输做加解密,使得对称密钥的交互传输变得非常安全了。
非对称密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等等一系列极其复杂的过程,作者本人也没有研究完全透彻。常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题。其中,最经典也是最常用的是RSA算法。
3.2.1 非对称加密相比对称加密更加安全,但也存在两个致命的缺点:
(1)CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%。如果后续的应用层数据传输过程也使用非对称加解密,那么CPU性能开销太庞大,服务器是根本无法承受的。赛门特克给出的实验数据显示,加解密同等数量的文件,非对称算法消耗的CPU资源是对称算法的1000倍以上。
(2)非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。
所以非对称加解密(极端消耗CPU资源)目前只能用来作对称密钥交换或者CA签名,不适合用来做应用层内容传输的加解密。
SSL介绍:
安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
SSL是Netscape于1994年开发的,后来成为了世界上最著名的web安全机制,所有主要的浏览器都支持SSL协议
目前有三个版本:2、3、3.1,最常用的是第3版,是1995年发布的。
SSL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
SSL的位置
SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。
Https建立过程?
SSL连接建立过程
客户端和服务器交换数据之前有个握手协议,具体过程是:
1、客户端初始化支持的加密算法、压缩算法、SSL协议版本,并向服务器发起消息结构体为client hello的连接
2、服务端收到消息,根据客户端提供的加密算法列表、压缩算法列表来选取后续使用的对称加密算法、压缩算法和SSL协议版本,并返回结构体为server hello的消息。
3、如果客户端需要服务器身份认证,服务器在返回server hello的消息后需立刻返回数字证书信息(通常服务器认证是必须的),并发送hello done的消息。
4、客户端验证证书是否有效,并发送用证书公钥加密的对称秘钥。
5、服务器收到加密的对称秘钥,使用自己的私钥解密,并发送通过对称秘钥加密的的会话完成信息 (finish信息)。
证书校验过程
颁发证书的机构会将证书内容使用指定的哈希函数生成内容hash,然后用自己的私钥加密哈希形成签名。证书指纹用于确定证书没有被修改。解密验证过程如上右图,如果最终得到的签名与客户端使用指定的签名算法得到的签名不一致,则证书是不可信的。
上图解释了一个证书签发的过程,我们校验的时候实际是通过颁发证书的相应机构根证书进行校验的,如果通过中间的机构来验证一定要找到一个根节点信任的,明文中存在签发机构,根据签发机构在本地的公钥进行校验,解密之后,计算Hash值来进行比对,确认该证书是可信任的,而且没有损坏的。
参考资料
Android安全开发之安全使用HTTPS
https通信原理
HTTPS中CA证书的签发及使用过程