Android okhttp3.0忽略https證書的方法
最近公司項(xiàng)目需要,網(wǎng)絡(luò)協(xié)議支持https,之前接觸不多,所以這次想總結(jié)一下https在android開發(fā)中的相關(guān)內(nèi)容
一、https證書
對(duì)于https和證書的概念,大家可以自行搜索百度。
證書分兩種:
1、花錢向認(rèn)證機(jī)構(gòu)購(gòu)買的證書,(我們公司買的證書一個(gè)就需要4000元,TMD,還不如多租一臺(tái)服務(wù)器)。服務(wù)器如果使用了此類證書的話,那對(duì)于移動(dòng)端來說,直接可以忽略此證書,直接用https訪問。與之不同的是ios內(nèi)置了很多信任的證書,所以他們不需要做任何操作
2、另一種是自己制作的證書,使用此類證書的話是不受信任的,也不需要花錢,所以需要我們?cè)诖a中將此類證書設(shè)置為信任證書
二、如何忽略證書
1、服務(wù)器的哥們?nèi)绻由狭俗C書的話,那么你們的網(wǎng)絡(luò)請(qǐng)求的url將從http:xx改成https:xx,如果你直接也將http改成https的話而什么也不做的話,客戶端將直接報(bào)錯(cuò),如圖:

意思就是沒有找到本地證書,那就開始構(gòu)建一個(gè)SSL來信任所有的證書,忽略證書其實(shí)就是如此。
2、新建一個(gè)類
public class SSLSocketClient {
//獲取這個(gè)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;
}
}
通過這個(gè)類我們可以獲得SSLSocketFactory,這個(gè)東西就是用來管理證書和信任證書的
但是有一點(diǎn)需要注意:

然后我們?cè)趏khttp中設(shè)置SSLSocketFactory,如圖:

運(yùn)行之后,發(fā)現(xiàn)還是會(huì)報(bào)錯(cuò),如圖:

意思是我們的請(qǐng)求證書和服務(wù)器的證書不一致,這是因?yàn)槲覀冞€需要配置一個(gè)HostnameVerifier來忽略host驗(yàn)證
三、在SSLSocketClient的類中再加入一個(gè)方法:
//獲取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
然后再okhttp中配置一下HostnameVerifier:

在運(yùn)行,可以正常訪問了
四、整體配置
copy整個(gè)工具類到你的項(xiàng)目中:
/**
* Created by Anonymous on 2017/6/13.
*/
public class SSLSocketClient {
//獲取這個(gè)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證書正常訪問你的網(wǎng)絡(luò)了,本人android小白,說的不對(duì)了,希望大神能指出,也希望大家多多支持腳本之家。
相關(guān)文章
Android常用定時(shí)器的實(shí)現(xiàn)方式
我們?cè)陂_發(fā)中時(shí)常需要寫一些定時(shí)的任務(wù),比如每5秒執(zhí)行一次,下面這篇文章主要給大家介紹了關(guān)于Android常用定時(shí)器的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
使用科大訊飛語音SDK實(shí)現(xiàn)文字在線合成語音
這篇文章主要介紹了使用科大訊飛語音SDK實(shí)現(xiàn)文字在線合成語音 的相關(guān)資料,需要的朋友可以參考下2015-12-12
android12?SD如何動(dòng)態(tài)申請(qǐng)讀寫權(quán)限
這篇文章主要給大家介紹了關(guān)于android12?SD如何動(dòng)態(tài)申請(qǐng)讀寫權(quán)限的相關(guān)資料,從Android?6.0開始,權(quán)限不再是在manifest?件中粘貼?下即可,這時(shí)候權(quán)限也正式?進(jìn)?家的視野,需要的朋友可以參考下2023-07-07
Android 線程thread的兩種實(shí)現(xiàn)方法(必看)
下面小編就為大家?guī)硪黄狝ndroid 線程thread的兩種實(shí)現(xiàn)方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Android應(yīng)用中使用及實(shí)現(xiàn)系統(tǒng)“分享”接口實(shí)例
為了應(yīng)用的推廣、傳播,很多的應(yīng)用中都有“分享”功能,這篇文章主要介紹了Android應(yīng)用中使用及實(shí)現(xiàn)系統(tǒng)“分享”接口實(shí)例,有興趣的可以了解一下。2016-12-12
Android開發(fā)優(yōu)化之Apk瘦身優(yōu)化指南
隨著業(yè)務(wù)快速發(fā)展,各種業(yè)務(wù)功能上線,版本不斷迭代,apk體積也越來越大,下面這篇文章主要給大家介紹了關(guān)于Android開發(fā)優(yōu)化之Apk瘦身優(yōu)化的相關(guān)資料,需要的朋友可以參考下2022-05-05
Android Studio 實(shí)現(xiàn)九宮格功能
這篇文章主要介紹了Android Studio 實(shí)現(xiàn)九宮格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Android實(shí)現(xiàn)界面跳轉(zhuǎn)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)界面跳轉(zhuǎn)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09

