最近来了家新公司,后台设计在非线上环境用自签名证书,线上环境用CA证书,然后发了份.cer公钥给我.让我在客户端处理一下.
我查了很多博客,只言片语的,
HTTPS的流程也比较长,
今天调试好了,贴出连续的代码给大家看一下.
https有2种情况 单向验证
和双向验证
单向认证
:客户端通过直接读取后台给的公钥验证握手
比如直接读取cer文件或者直接把公钥写在代码里.
双向认证
:客户的有公钥,后台也有公钥,互相存储对方的公钥,验证网络通讯,
这个时候Android端要生成bks.
有很多博客一上来就生成bks,一定要知道什么场景.
而我现在讨论单向验证,
基于鸿洋大神的这篇做代码补充:
Android Https相关完全解析 当OkHttp遇到Https
单向验证方法一:简单粗暴,直接信任所有.
在MainActicity.java中: 有个网络请求:loadData()方法
public void loadData() {
SSLSocketFactoryUtils.MyX509TrustManager myX509TrustManager= new SSLSocketFactoryUtils.MyX509TrustManager();
OkHttpClient okhttpclient=new OkHttpClient.Builder()
.sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(), SSLSocketFactoryUtils.createTrustAllManager())
.hostnameVerifier(new SSLSocketFactoryUtils.TrustAllHostnameVerifier())
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://gw.dev.cmrh.com:8888/RH_MAS/")
.client(okhttpclient)
.addConverterFactory(
new Converter.Factory(){
public @Nullable Converter<ResponseBody, ?> responseBodyConverter(Type type,
Annotation[] annotations, Retrofit retrofit) {
return new Converter<ResponseBody, Object>() {
@Override
public Object convert(ResponseBody value) throws IOException {
return value.string();
}
};
}
})
.build();
GitHubService service = retrofit.create(GitHubService.class);
Call<String> call = service.listRepos();
call.enqueue(MainActivity.this);
}
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.d("body-onResponse",response.body()+";;;;;;");
}
@Override
public void onFailure(Call<String> call, Throwable t) {
t.printStackTrace();
Log.d("body-onFailure",call.request().url()+"============");
}
关键的就是OkHttpClient里的 sslSocketFactory
和 hostnameVerifier
设置
然后就是 Retrofit.client(okhttpclient)
使用我们自己设置的client.
SSLSocketFactoryUtils.java的实现内容:
public class SSLSocketFactoryUtils {