Androidokhttp3.0忽略https证书的⽅法
最近公司项⽬需要,⽹络协议⽀持https,之前接触不多,所以这次想总结⼀下https在android开发中的相关内容
⼀、https证书
对于https和证书的概念,⼤家可以⾃⾏搜索百度。
证书分两种:
1、花钱向认证机构购买的证书,(我们公司买的证书⼀个就需要4000元,TMD,还不如多租⼀台服务器)。服务器如果使⽤了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接⽤https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作
2、另⼀种是⾃⼰制作的证书,使⽤此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书
⼆、如何忽略证书
1、服务器的哥们如果加上了证书的话,那么你们的⽹络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话⽽什么也不做的话,客户端将直接报错,如图:
意思就是没有到本地证书,那就开始构建⼀个SSL来信任所有的证书,忽略证书其实就是如此。
2、新建⼀个类
public class SSLSocketClient {
//获取这个SSLSocketFactory
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = Instance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
SocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获取TrustManager
private static TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
return trustAllCerts;
}
}
通过这个类我们可以获得SSLSocketFactory,这个东西就是⽤来管理证书和信任证书的
但是有⼀点需要注意:
然后我们在okhttp中设置SSLSocketFactory,如图:
运⾏之后,发现还是会报错,如图:
意思是我们的请求证书和服务器的证书不⼀致,这是因为我们还需要配置⼀个HostnameVerifier来忽略host验证三、在SSLSocketClient的类中再加⼊⼀个⽅法:
//获取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
然后再okhttp中配置⼀下HostnameVerifier:
在运⾏,可以正常访问了
四、整体配置
copy整个⼯具类到你的项⽬中:
/**
* Created by Anonymous on 2017/6/13.
*/
public class SSLSocketClient {
//获取这个SSLSocketFactory
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = Instance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());android retrofit
SocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获取TrustManager
private static TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) { }
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
return trustAllCerts;
}
//获取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
}
然后再okhttp中配置
mHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.
addInterceptor(new LogInterceptor())
.addInterceptor(new TokenInterceptor())
.SSLSocketFactory())//配置
.HostnameVerifier())//配置
.build();
如果你⽤的是retrofit,在retrofit中配置⼀下okhttp即可
retrofitAPI = new Retrofit.Builder()
.baseUrl(AppConfig.baseUrl)
.ate())
.ate())
.client(mHttpClient)//配置okhttp
.
build()
.create(RetrofitAPI.class);
这样你就可以忽略https证书正常访问你的⽹络了,本⼈android⼩⽩,说的不对了,希望⼤神能指出,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论