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行 realPubKey
和encoded
就需要做一个比较 ,如果不成立 证书公钥就验证错误 这个时候就返回False了,访问就会挂掉
在这里可以看到181行 我这里做了一个证书消息验证,外面包含了一成try catch,在里面任意一个地方又错误的话,就直接返回失败了,这里呢就是我们HostnameVerifier
的验证
这下面的内容 和httpurlconnection
是一样的,去得到证书里面的一些信息,如果前面都通过了 那说明证书公钥都验证正确了
上面是HostnameVerifier
的内容,下面需要说下sslSocketFactory
内容
OKhttp里面有多个函数形式可以表示 因为版本太多了,sslSocketFactory
两个重载方法,常用的一般是 sslSocketFactory
和HostnameVerifier
在builder
下面加的
一般用这个传sslSocketFactory
和trustManager
的
在这里 我定义了一个trustManager
的属性
首先 104行 先把我们证书的输入流传进来
然后跟入createSSLSocketFactory
,然后还是用SSLContext
去得到我们的SocketFactory
对象,调用的还是SSLContext
的类,在下面有init
方法,new
了个TrustManager
TrustManager
就是上面114行那里得到的,最终118行 getSocketFactory()
,这里的写法与另一篇HttpsUrlConnection的差不多,但是okHttp里面用之前的写法会出错
我们这里跟下TrustManager
的从那里来的,从114行 trustManagerForCertificates
跟入
可以跟入newEmptyKeyStore
了解下是如何写的
在回到用来代码中继续
那上面是一些初始化动作,下面是得到trustManager
是要包含我们证书的trustManager
首先生产一个空的keyStore,把我们的证书设置到keyStore里面,然后把keyStore初始化,然后根据keyStore初始化我们的TrustManagerFactory
然后在通过.getTrustManagers()
去得到可信任的证书管理器,说白了证书管理器里面是有三个证书的 信任里面证书链里面的所有证书,得到可信任管理器后返回第0个(服务器实体证书)
如果你要过验证的话 需要去Hook的点就是TrustManagerFactory
下的getTrustManagers
方法,这里在JustTrueme
模块是有写的,但是他没有写这个HostnameVerifier
,如果在HostnameVerifier
下面做校验的话就没办法去Hook到
那这里主要是让各位了解OkHttp的 sslSocketFactory
和hostnameVerifier
以及基本请求方法