OKhttp证书锁定
目前主用的大版本OkHttp,OkHttp3
由于是个第三方库,所以需要引入他,我这里使用Android studio 往build.gradle
添加implementation 去引入这个包和具体版本
>OKhttp3基本用法
做请求
做请求的话这个也必须放到一个线程里面去的,主线程是不能去进行网络访问的,不放入子线程里面去程序会崩溃
用new Thread() ......start()
去复写里面的run
方法
在run
方法里面执行OkHttpClient
的请求
首先是实例化一个client
对象,这个方法是自己写的,实例化没怎么简单后面在说
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内容
访问页面是成功的
下面来讲下client
是怎么来的
createClient()跟进去
抛开证书验证的代码,最基本的请求方式就是 100行的OkHttpClient client = new OkHttpClient.Builder()
同样是得到我们OkHttpClient.Builder
对象,然后在Builder
对象下面添加一系列的方法最终.build
得到OkHttpClient
的对象然后返回,Tips:如果不需要加一些列方法的话可以直接new OkHttpClient
得到的也是一个Builder()对象
http的证书验证比较多
1.certificatePinner(CPinner)
这个是证书锁定 他需要接受CertificatePinner
对象 通过new CertificatePinner.Builder()
这个去实例化然后里面去添加你需要锁定的证书域名和Pinner
证书签名sha256 ,那这个值如何来的? 我们将sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
试一试,他会返回告诉你证书锁定失败,下面是证书链 分别是 服务器实体证书 中间证书 根证书,里面呢有个sha256就直接取就可以了
如果有多个证书 就多个.add
去添加
这里也顺便了解下CertificatePinner
检测是在那个地方,CertificatePinner
类下有个check
方法
他会把hostname和证书链表传进来然后findMatchingPins(hostname) 根据你机器的Pins
根据你的域名然后找到证书的pins
得到你的pins
类型列表
有了列表之后进行遍历,首先会去遍历证书链 第一个for
里面的循环遍历Pins
,是sha256还是sha1然后在去进行sha256或sha1的计算去进行比对最终的值,如果比对成功的话就直接return了
如果比对失败则会报错进行 进行下面的流程,最终也是会抛出一个错误
那findMatchingPins
又从那里来的呢?find什么东西?继续跟入
从219行 Pins里面去找,Pins可以理解为是个数组,去遍历里面的东西然后取出里面的一些值,如果说pin.matches(hostname)
结果是空的话 就实例化一个数组(221行)然后把你新的pin
加进入(这个for循环是Java里面的加强for循环,和for循环一样看上去只是写法不一样)
初始化的一个属性,是个set
集合,那是在什么时候设定的呢? 我们可以找下add
方法
add方法
首先传进来一个pattern
就是我们的域名,然后传进来pins
这个pins
可以多个的,然后里面就去遍历了一下pins
,然后把所有pins
通过这个new
对象,加到了pins set
集合里面去
sslSocketFactory
校验证书链hostnameVerifier
校验域名
锁定证书Hook总之来说要CertificatePinner
下的check
方法Hook掉就可以过证书锁定了