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