iOS 自签名证书有时比CA机构证书更安全的个人见解
进入新年,新时代,大家都会对网络请求的安全性要求增高,而且由于Https应用的越来越广泛,而且抓包工具的越来越简便,大家都会没事尝试抓个包,但是,在这个抓包过程中,让我们感觉到惊讶的是,某些大公司的app(京东,淘宝,使用正规CA机构签名的服务器证书的)数据好多可以抓包出来(不绝对,只是对比),反而是一些小公司的,使用自签名SSL证书的某些https请求抓不出来,不知道大家有没有注意!
为什么会出现这个问题呢? 这就是我感觉到有意思的地方,首先,我们将这两种情况分开叙述一下,先讲一下抓包的原理: 中间人攻击
中间人攻击 大家可以看一下百科,具体的详细步骤不叙述,在此只描述一点我们暂时用到的地方,就是这个攻击过程中的安全校验问题,比如三个对象分别为
- 客户端Client A
- 抓包代理工具B
- 我们访问的服务器 C
前提条件 :
一般Https抓包之前,需要安装抓包代理工具B 的SSL证书,以charles为例,进行https抓包之前,客户端需要安装如下证书:
image.png
分别是安装在不同设备上的根证书,上面的一般是安装到电脑上的根证书,下面的是撞到移动设备的根证书(记得装完之前 开启对证书的信任,否则无法抓包)
角色分析对比:
开启的青花瓷抓包的过程如下图
image.png
在抓包过程中,进行网络请求的时候,请求由客户端A发出,经过代理服务器B,到达远端服务器C,C收到请求返回给B,B再转回到A,
第一步中,B相对于A是服务器,A相对于B是客户端,
第二步: 代理服务器B相对于远端服务器C是客户端,远端服务器相对于B是服务器,
客户端网络请求进行的安全校验过程,分为以下2种情况讨论.分别为 正规CA机构签名,自签发2种,分别讨论:
1.正规CA机构签名证书: 这种证书的签名机构的根证书会默认植入到系统的信任列表中,这个列表是动态的,iOS的信任列表可以在官方文档查找,地址为:https://support.apple.com/zh-cn/HT204132
当我们请求服务器时,由于被设置代理,服务器(代理服务器B)返回的证书其实是我们之前设置的代理工具的根证书签名的证书,当进入挑战的时候,会优先使用系统的证书信任列表中的数据,由于已经在我们的系统信任列表中(根证书被我们安装到了设备上,相当于我们信任了此根证书签发的任何叶证书),然后这个请求遇到挑战的时候,使用设备系统当前的默认信任列表时,就这样过去了
-
自签名SSL证书
当前环境下,大家一般都是使用AFNetworking,但是也不排除自己写网络请求的,但是我们此时讨论的是以AFNetworking为例的,因为AFNetworking为了处理自签名证书,在安全策略中,根据官方文档,加入了一个处理,
image.png
上面的翻译是我翻译的大概意思,英语一般,这样造成了,使用AFNetworking作为网络请求工具,如果使用自签名服务器,必须添加对应的证书到bundle环境中,否则所有的网络请求都会因为挑战无法通过AF此次的代理判断而cancel(但是我们如果自己使用原生的代码,可以自己设置通过,此处只是AFNetworking自己按照苹果文档加的一个安全性的处理),返回-999,所以,大家一般都是添加对应服务器的根证书到bundle中,以便能够正常请求网络服务
安全策略大家一般为下图:
此处讨论的AFSSLPinningMode是AFSSLPinningModeCertificate的,这种是一般使用AFNetworking都使用的策略,如果使用上述安全策略,那么
-
第一步,即当客户端A请求代理服务器B的时候,由于B返回的SSL证书和客户端A bundle中的证书不一致(AFNetworking会自动搜索bundle 目录下所有后缀为.cer的文件,并且经为根证书),
-
然后AFNetworking会遍历系统信任列表中的所有证书并且设置为根证书,然后判断服务端证书返回的证书是否和客户端bundle的证书是否完全一致,然后返回是否成功,
-
但是在此处判断中,客户端收到的证书由于被青花瓷给替换成了青花瓷签发的证书,所以校验无法通过,请求会被取消!
综上所述,使用自签名服务器,在使用和AFNetworking推崇的安全策略一致的情况下,有些情况下,自签名服务器证书比CA证书的更安全(因为使用正规CA签名的证书,大家都不会管证书的内容和校验),我个人理解是这样的,不知道你们是否也是这样理解,有不同见解,请留个言,互相学习一下!