参考:
https://mp.weixin.qq.com/s/E75toyRukUHEtt34-snEgQ
https://mp.weixin.qq.com/s/adZC0N5Fd4X9FjxUrdlS1w
https://mp.weixin.qq.com/s/7sX3AY7gJomJ2ZEErUqmKA
上篇文章我们讲到了Android-Http,这次我们紧接着讲一下Https。
1. Https简介
Https协议端口是443,与Http协议相比在早期加入了SSL加密,从而保证了我们的数据在网络上传输的安全性。不过现在主流的加密方式是SLL/TLS。TLS的前身就是SSL加密。
2. Http与Https的优缺点
我之前说到过Http协议,我们说他的特点的时候说其:简单,灵活,无状态,无连接,正因为这些特点,Http的优点是:通信速度快,节约时间。
那么Http协议的缺点呢?我们来总结一下:
- 我们说Http是TCP/IP协议,TCP是确保可靠的协议,但TCP协议并不能保证每次都完整的传输数据,也就是可能导致Http层数据不完整,换句话说Http协议传输的过程中也并没有进行数据完整性的校验,容易被篡改。
- Http是明文传输,其传输内容容易被窃听。
- http协议传输的过程中没有身份验证这一说,也容易被冒充。
不说不知道,一说吓一跳,正是由于Http协议存在安全性问题,所以Https应运而生,针对于以上缺陷,https增加了两种技术:加密技术和身份验证。所以Https的优点是:
- 所有信息加密传输,防止三方窃听通信内容
- 具有校验机制,内容一旦被篡改,通信双发立刻会发现
- 配备身份证书,防止身份被冒充
3. Https的加密和身份验证技术
3.1 Https的加密
因为对称加密算法不易保管,再加上安全性也不是很高,所以Https主要用到以DES为代表的对称加密算法和以RSA为代表的非对称加密算法的混合加密算法。交换密钥的时候采取非对称的,建立通信交换报文的时候采取对称加密的方法。
关于对称和非对称加密我之前有写过文章,参考Android-加解密
3.2 Https的身份验证
所谓身份验证就是要有数字证书。因为非对称加密存在一个问题:就是没法验证拿到服务器端公开的公钥。数字证书可以解决这个问题,数字证书通常来说是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,证书中包含了一个密钥对(公钥和私钥,我们用到公钥,就包含在数字证书里)和所有者识别信息。数字证书被放到服务端,具有服务器身份验证和数据传输加密功能。这也就是数字证书的左右:分发公钥,验证身份。
再来一张数字证书的工作流程:
那么如何生成数字证书呢?,CA应用而生(Certifity Authority),即数字证书认证机构。
3.3 CA
CA的使用流程:
1.相关人去CA机构进行公钥申请。
2.CA机构会验证申请者的信息真实性,合法性。
3.通过审核后,CA机构会做数字签名,给其证书。证书里面包含申请者的信息,数字签名后的公钥,有效时间和签名。
4.客户端https建立连接的时候向服务端要证书。
5.读取证书信息,拿公钥进行解密校验。
6.客户端会内置CA的信息,如果不存在或者信息不对,证明CA非法
备注:遵循私钥永远都是服务端一方掌握。
当然除了CA机构颁发的证书之外,还有非CA机构颁发的证书和自签名证书。
- 非CA机构即是不受信任的机构颁发的证书,理所当然这样的证书是不受信任的。
- 自签名证书,就是自己给自己颁发的证书。当然自签名证书也是不受信任的。
比如我们上网经常遇到的情况:
此情况就是该网站的证书存在问题,不是正式CA机构认证的。
4 Https协议的误区
误区一:对于CA机构颁发的证书客户端无须内置
很多人反映我们用的就是Https为什么我的客户端没有配置证书呢?如:请求百度的网站https://www.baidu.com/,和请求HTTP服务器没什么区别?
答:因为在Android系统中已经内置了所有CA机构的根证书,也就是只要是CA机构颁发的证书,Android是直接信任的。所以我们才可以在客户端没有配置证书的情况下正常请求。但这样做会有一个安全隐患:比如某个黑客自家搭建了一个服务器并申请到了CA证书,由于我们客户端没有内置服务器证书,默认信任所有CA证书(客户端可以访问所有持有由CA机构颁发的证书的服务器),那么黑客仍然可以发起中间人攻击劫持我们的请求到黑客的服务器,实际上就成了我们的客户端和黑客的服务器建立起了连接,这也就是常说的中间人攻击。
误区二:对于非CA机构颁发的证书和自签名证书,可以忽略证书校验。
另外一种情况,如果我们服务器的证书是非认证机构颁发的 或者自签名证书,那么我们是无法直接访问到服务器的,直接访问通常会抛出如下异常:网上很多解决SSLHandshakeException异常的方案是自定义TrustManager忽略证书校验。对于这样的处理方式虽然解决了SSLHandshakeException异常,但是却存在更大的安全隐患。因为此种做法直接使我们的客户端信任了所有证书(包括CA机构颁发的证书和非CA机构颁发的证书以及自签名证书),因此,这样配置将比第一种情况危害更大。
这两种方式的解决办法请参考:https://mp.weixin.qq.com/s/E75toyRukUHEtt34-snEgQ。
5 Https协议的原理
协议的实现:
TLS,记录协议负责在传输连接上交换底层信息,并加以配置加密。每一条tls记录包含标头和消息内容两部分。标头包含类型,版本和长度。和报文类似。盗图一张:
TLS有四个核心协议:
- 握手协议:单项最常见,验证服务端身份。双向验证,客户端和服务端都需要验证。
- 密钥变更协议
- 应用协议
- 警报协议
SSL原理(Https加密原理):
SSL/TLS协议基本思路是采用混合加密的方式。大概流程是,客户端向服务器发起请求,然后服务器收到请求后,发送服务器端生成的公钥给客户端,客户端收到加密的公钥后做两件事:(1)客户端自己采用对称加密生成秘钥key,对传输数据进行加密。(2)客户端用服务端给的公钥对key进行加密,然后发送用key加密的传输数据和用公钥加密的key给服务器(注意此时传输在网络的key是用公钥加密后的)。服务器端在收到客户端的数据后用服务器短的私钥解密出客户端用公钥加密的key,然后用key在将key传输数据解密。
SSL详细过程如下:
客户端给出协议版本号、一个客户端随机数A(Client random)以及客户端支持的加密方式
服务端确认双方使用的加密方式,并给出数字证书(数字证书中包含公钥P)、一个服务器生成的随机数B(Server random)
客户端确认数字证书有效并且接收到随机数B,自己生成对称加密的秘钥Key,对自己要传给服务器的数据用Key进行对称加密。
.客户端使用证书中的公钥对Key在加密,连同之前用Key加密的数据一起发送给服务端(注意此时在网络传输的Key是用公钥加密的Key)。
服务端使用自己的私钥解密出对称加密的Key,之前又收到了随机数A,客户端和服务器根据约定的加密方法,用这个秘钥Key解密出客户端要传个服务器的数据。
5. Http和Https的区别
最后我们总结一下Http和Https的区别:
https协议需要到CA申请证书,大多数情况下需要一定费用
Http是超文本传输协议,信息采用明文传输,Https则是具有安全性SSL加密传输协议
Http和Https端口号不一样,Http是80端口,Https是443端口
Http连接是无状态的,而Https采用Http+SSL构建可进行加密传输、身份认证的网络协议,更安全。
Http协议建立连接的过程比Https协议快。因为Https除了Tcp三次握手,还要经过SSL握手。连接建立之后数据传输速度,二者无明显区别
其实这篇文章主要是对大神文章的总结,和我个人的理解,再次感谢分享。