OKhttp证书校验

之前httpurlconnection 是通过hostname直接返回真,就是不做任何的校验,那其实在里面是可以做验证的

>OKhttp证书校验

175行 getPeerCertificateChain()[0]; 得到证书链 得到数组 取出第0个成员,得到服务器实体证书
176行 我这里去获取他的公钥强制转换成Publickey,得到公钥
177行 得到公钥后就调用他下属的getEncoded方法去得到我们的字节,进行一个base64编码得到base64编码值

在当前通信环境的公钥已经算好了,然后就需要和原先服务器证书公钥值进行对比,我这里已经将证书的公钥内嵌入代码中,通过CertificateFactory.getInstance得到一个单例(单例的意思就是这个对象只会存在一个,如果你已经存在的话他会给你返回创建一个东西,没有则创建一个)得到X.509的单例 去到179行 generateCertificate去生成一个证书对象 得到一个x509的证书,这里需要传入一个输入流,把字节.getBytes()了一下通过ByteArrayInputStream转成输入流,然后PUB_KEY得到的是一个证书 180行 又获取一次公钥和获取公钥字节然后进行base64编码,然后190行 realPubKeyencoded就需要做一个比较 ,如果不成立 证书公钥就验证错误 这个时候就返回False了,访问就会挂掉

在这里可以看到181行 我这里做了一个证书消息验证,外面包含了一成try catch,在里面任意一个地方又错误的话,就直接返回失败了,这里呢就是我们HostnameVerifier的验证

Image.png

这下面的内容 和httpurlconnection是一样的,去得到证书里面的一些信息,如果前面都通过了 那说明证书公钥都验证正确了

Image.png

上面是HostnameVerifier的内容,下面需要说下sslSocketFactory内容

Image.png

OKhttp里面有多个函数形式可以表示 因为版本太多了,sslSocketFactory两个重载方法,常用的一般是 sslSocketFactoryHostnameVerifierbuilder下面加的

一般用这个传sslSocketFactorytrustManager

Image.png

在这里 我定义了一个trustManager的属性

首先 104行 先把我们证书的输入流传进来

Image.png

然后跟入createSSLSocketFactory,然后还是用SSLContext去得到我们的SocketFactory对象,调用的还是SSLContext的类,在下面有init方法,new了个TrustManager
TrustManager就是上面114行那里得到的,最终118行 getSocketFactory(),这里的写法与另一篇HttpsUrlConnection的差不多,但是okHttp里面用之前的写法会出错

Image.png

我们这里跟下TrustManager的从那里来的,从114行 trustManagerForCertificates跟入

Image.png

可以跟入newEmptyKeyStore了解下是如何写的

Image.png

在回到用来代码中继续

Image.png

那上面是一些初始化动作,下面是得到trustManager是要包含我们证书的trustManager

Image.png

首先生产一个空的keyStore,把我们的证书设置到keyStore里面,然后把keyStore初始化,然后根据keyStore初始化我们的TrustManagerFactory然后在通过.getTrustManagers()去得到可信任的证书管理器,说白了证书管理器里面是有三个证书的 信任里面证书链里面的所有证书,得到可信任管理器后返回第0个(服务器实体证书)

如果你要过验证的话 需要去Hook的点就是TrustManagerFactory下的getTrustManagers方法,这里在JustTrueme模块是有写的,但是他没有写这个HostnameVerifier,如果在HostnameVerifier下面做校验的话就没办法去Hook到

Image.png

那这里主要是让各位了解OkHttp的 sslSocketFactoryhostnameVerifier 以及基本请求方法

本文链接:

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