SSL Pin 研究和原理以及在iOS调试的坑
最近碰到个在 ReactNative 里面使用 SSL pin 的坑,困扰了我许久,解决后记录下。 什么是 SSL,安全性怎么保障 https 我们很熟悉,iOS 是默认强制使用的,https 本质是运行在 ssl 加密通道上的 http,核心是 ssl 加密。ssl 加密是通过服务端下发共用证书,协商好加密方案后建立的加密通道。 安全性是通过系统内置的知名 CA 的根证书,与建立 SSL 通道时候,服务端下发的证书链进行比对,来保障。这里默认 CA 是可以信任的,那么 CA 签发的证书就是可信的。CA 下发的证书可以跟 CA 的根证书形成证书链条,用以进行证书有效性确认。安全性得以保障。 SSL pin 是什么,用在什么场景 ssl 加密通道是非对称加密通道,服务端下发了公钥,客户端进行加密,服务端拿私钥进行解密,本质上是信任了 CA 签发的证书,也就是服务端作为主导。 但 CA 有时候也不靠谱,万一证书签发错误,或者泄漏给别人了,咋办?SSL pin 这时候就是用来进行额外的保障。 SSL pin 通过在客户端内置公钥证书,和服务端下发的证书做比对,在系统比对的基础上,增加一层自己比对的过程。自己比对的时候,就可以在 CA 证书之外,有自签名证书作为额外一层保障。这时候,即使对方拿到了 CA 签发的正确证书,我们自己签发的证书也可以保障服务的安全性。 iOS 中 SSL pin 怎么用 iOS 中用 NSURLSession 的时候,指定一个实现了URLSession:didReceiveChallenge:completionHandler方法的 delegate,就可以在回调方法里,进行自定义的证书比对过程。 整个过程相对比较麻烦,所以现在大家用的比较多的是通过一个开源库TrustKit进行比对。 TrustKit 通过配置域名和与之对应的公钥证书签名,(这里后续的描述是有问题的,看后续更新中“Public Key Pinning 是怎么实现的”这段)在 SSL 通道建立的时候,获取到证书链,比对证书链中每个证书,一旦有比对成功的,就算是成功,如果所有的都比对失败,就算是 SSL pin 失败了。SSL pin 失败,会打断 ssl 通道的建立,所以后续 ssl 通道上的 http 请求也不会发生。
Read more...