1.添加日志输出
|
|
2.添加请求头信息
在 Retrofit官方文档的翻译 一文中有提到,每一个请求都需要添加相同的 header的时候可以使用 OkHttp 的 interceptor 来指定。
|
|
3.支持自签名的https
首先这里要说一下,看到网上说了很多okhttp如何支持https的文章。首先要了解的是,okhttp默认情况下是支持https协议的网站的,比如 https://www.baidu.com 等,这些网站可以直接通过okhttp请求,不需要添加而外的支持。不过要注意的是,支持的https的网站基本都是CA机构颁发的证书,默认情况下是可以信任的。
然后我们今天要说的是自签名的https,什么叫自签名呢?就是自己通过keytool去生成一个证书,然后使用,并不是CA机构去颁发的。使用自签名证书的网站,大家在使用浏览器访问的时候,一般都是报风险警告,好在有个大名鼎鼎的网站就是这么干的,https://kyfw.12306.cn/otn/ ,点击进入12306的购票页面就能看到了。
在写本文之前也查看了很多资料,我呢,尽量把每一步都说的详细一点。
SSL单向认证
加入证书源文件,证书可以放在assets 下面,或者raw 下面也是可以的:
构造keyStore对象, 然后将得到的CertificateStream放入到keyStore中。
12345InputStream certificateStream = mContext.getResources().openRawResource(R.raw.srca);KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(certificateStream, "password".toCharArray());接下来利用keyStore去初始化我们的TrustManagerFactory.
|
|
- 由trustManagerFactory.getTrustManagers获得TrustManager[]初 始化我们的SSLContext123456//"TLS" SSL协议 由服务器端确定SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init (null,trustManagerFactory.getTrustManagers(),null);
根据okhttp3.0以前的版本,上面这样写是没问题的,3.0以后版本API文档中,这样写道:
If necessary, you can create and configure the defaults yourself with the following code:
如果有必要,你可以参考下面的代码根据自己的需求创建和设置的默认值。
|
|
- 那根据上面的提供,我们来修改一下SSLContext的初始化:12345678TrustsManager[] trustManagers = trustManagerFactory.getTrustManagers();X509TrustManager trustManager = chooseTrustManager(trustManagers);if (trustManager != null) {trustManager = new MyTrustManager(chooseTrustManager(trustManagers));} else {trustManager = new UnSafeTrustManager();}sslContext.init(null, new TrustManager[]{trustManager}, null);
|
|
|
|
- 最后,设置我们OkHttpClient即可。
|
|
到此为止,单向认证基本讲完了 ,接下来双向认证就相对简单了。
SSL双向认证
核心代码:
关于客户端证书文件,Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件。
4.认证机构认证后的https
添加证书certificatePinner
certificatePinner(CertificatePinner certificatePinner) 的是在 由正式证书颁发机构认证的情况下,避免证书颁发机构的非法访问。
|
|
这是主机名验证
设置用于确认响应证书申请请求的主机名的HTTPS连接的验证。
如果不设置,默认的主机名校验将被使用。
|
|
最后,Retrofit与 okhttp3.0的结合:
总结
关于okhttp的使用,本文不多说,主要是retrofit与okhttp相结合使用中用到的部分,本文也只是本人在 okhttp 与 retrofit 的结合使用中的一点总结,如果有不对的地方,望书友们指导。
参考文章: