Android okhttp3.0忽略https證書的方法
最近公司項目需要,網絡協(xié)議支持https,之前接觸不多,所以這次想總結一下https在android開發(fā)中的相關內容
一、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 = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} 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,如圖:

運行之后,發(fā)現(xiàn)還是會報錯,如圖:

意思是我們的請求證書和服務器的證書不一致,這是因為我們還需要配置一個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 = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} 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(SSLSocketClient.getSSLSocketFactory())//配置
.hostnameVerifier(SSLSocketClient.getHostnameVerifier())//配置
.build();
如果你用的是retrofit,在retrofit中配置一下okhttp即可
retrofitAPI = new Retrofit.Builder()
.baseUrl(AppConfig.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(mHttpClient)//配置okhttp
.build()
.create(RetrofitAPI.class);
這樣你就可以忽略https證書正常訪問你的網絡了,本人android小白,說的不對了,希望大神能指出,也希望大家多多支持腳本之家。
相關文章
Android 線程thread的兩種實現(xiàn)方法(必看)
下面小編就為大家?guī)硪黄狝ndroid 線程thread的兩種實現(xiàn)方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
Android應用中使用及實現(xiàn)系統(tǒng)“分享”接口實例
為了應用的推廣、傳播,很多的應用中都有“分享”功能,這篇文章主要介紹了Android應用中使用及實現(xiàn)系統(tǒng)“分享”接口實例,有興趣的可以了解一下。2016-12-12
Android開發(fā)優(yōu)化之Apk瘦身優(yōu)化指南
隨著業(yè)務快速發(fā)展,各種業(yè)務功能上線,版本不斷迭代,apk體積也越來越大,下面這篇文章主要給大家介紹了關于Android開發(fā)優(yōu)化之Apk瘦身優(yōu)化的相關資料,需要的朋友可以參考下2022-05-05

