OKhttp证书锁定

目前主用的大版本OkHttp,OkHttp3

由于是个第三方库,所以需要引入他,我这里使用Android studio 往build.gradle添加implementation 去引入这个包和具体版本
Image.png

>OKhttp3基本用法
做请求
做请求的话这个也必须放到一个线程里面去的,主线程是不能去进行网络访问的,不放入子线程里面去程序会崩溃

new Thread() ......start()去复写里面的run方法

Image.png

run方法里面执行OkHttpClient的请求

首先是实例化一个client对象,这个方法是自己写的,实例化没怎么简单后面在说

Image.png

client需要做一系列的配置,然后request也要做一系列配置,传到newCall里面去进行请求在.execute去执行

仔细来讲
在OkHttp里面很喜欢用两个东西 一个是.Builder() 一个是.build() 这两个可以理解成构建器 就是把你想加的参数都加到构建器下面

比如代码中的new Request.Builder() 得到就是Builder构建器对象 然后这个对象下面去添加一系列的(方法)配置 最后.build()后返回Request。那build 可以加 链接 请求方法(请求方法如果是get可以不用写,.post的话里面还需要加请求主体对象 就还需要实例化一个主体对象,demo按简单的来,.addheader添加协议头 默认的user-agent是okhttp3 访问百度的话需要修改不然无法返回) 然后.build得到我们request 这就是请求部分 然后丢newcall里面去执行,client.newCall(request).execute();是同步请求 得到response后就去得到里面的string内容

访问页面是成功的

Image.png

下面来讲下client是怎么来的
createClient()跟进去

Image.png

抛开证书验证的代码,最基本的请求方式就是 100行的OkHttpClient client = new OkHttpClient.Builder() 同样是得到我们OkHttpClient.Builder对象,然后在Builder对象下面添加一系列的方法最终.build得到OkHttpClient的对象然后返回,Tips:如果不需要加一些列方法的话可以直接new OkHttpClient得到的也是一个Builder()对象

Image.png

http的证书验证比较多
1.certificatePinner(CPinner) 这个是证书锁定 他需要接受CertificatePinner对象 通过new CertificatePinner.Builder()这个去实例化然后里面去添加你需要锁定的证书域名和Pinner 证书签名sha256 ,那这个值如何来的? 我们将sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA=试一试,他会返回告诉你证书锁定失败,下面是证书链 分别是 服务器实体证书 中间证书 根证书,里面呢有个sha256就直接取就可以了

Image.png

如果有多个证书 就多个.add去添加

Image.png

这里也顺便了解下CertificatePinner检测是在那个地方,CertificatePinner类下有个check方法
他会把hostname和证书链表传进来然后findMatchingPins(hostname) 根据你机器的Pins根据你的域名然后找到证书的pins得到你的pins类型列表

Image.png

有了列表之后进行遍历,首先会去遍历证书链 第一个for

Image.png

里面的循环遍历Pins,是sha256还是sha1然后在去进行sha256或sha1的计算去进行比对最终的值,如果比对成功的话就直接return了

Image.png

如果比对失败则会报错进行 进行下面的流程,最终也是会抛出一个错误

Image.png

findMatchingPins又从那里来的呢?find什么东西?继续跟入

Image.png

从219行 Pins里面去找,Pins可以理解为是个数组,去遍历里面的东西然后取出里面的一些值,如果说pin.matches(hostname)结果是空的话 就实例化一个数组(221行)然后把你新的pin加进入(这个for循环是Java里面的加强for循环,和for循环一样看上去只是写法不一样)

Image.png

初始化的一个属性,是个set集合,那是在什么时候设定的呢? 我们可以找下add方法

Image.png

add方法
首先传进来一个pattern 就是我们的域名,然后传进来pins 这个pins可以多个的,然后里面就去遍历了一下pins,然后把所有pins通过这个new 对象,加到了pins set集合里面去

Image.png

sslSocketFactory 校验证书链
hostnameVerifier 校验域名

Image.png

锁定证书Hook总之来说要CertificatePinner下的check方法Hook掉就可以过证书锁定了

本文链接:

https://www.linqi.net.cn/index.php/archives/130/