OKhttp實(shí)現(xiàn)自簽名https請求

項(xiàng)目需求改變,需要更加安全的網(wǎng)絡(luò)請求,然后就需要我們在android客戶端實(shí)現(xiàn)單向認(rèn)證請求。

直接上代碼



public class OkHttpsManager {

// public static int REQ_TYPE = 3; // 1:http 2:https 3:https clientCA

private static String clientP12 = "www/client.p12";

// private static String p12Pwd="citicbank"; //測試密碼 citicbank

//你的密碼

private static String p12Pwd = "citicbank@"; // citicbank@ 正式密碼

private static OkHttpsManager manager;

private OkHttpsManager(){}

public static OkHttpsManager getInstance(){

if(manager==null){

synchronized (OkHttpsManager.class) {

if(manager==null){

manager=new OkHttpsManager();

}

}

}

return manager;

}

/**

* 客戶單證書 被 Okhttp 使用

*

* @return

* @throws Exception

*/

public? OkHttpClient mytrust()throws Exception{

? javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];

? Log.e("sslt",trustAllCerts.length+"");

? ? ? ? javax.net.ssl.TrustManager tm = new miTM();

? ? ? ? trustAllCerts[0] = tm;

? ? ? ? javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");


? ? ? ? //客戶端證書

? ? ? ? KeyManager[] clientkeyManagers =getClientKeyManager();

? ? ? ? sc.init(clientkeyManagers, trustAllCerts, null);

? ? ? ? OkHttpClient client = new OkHttpClient.Builder()

.connectTimeout(10, TimeUnit.SECONDS)

.sslSocketFactory(sc.getSocketFactory())

.readTimeout(5, TimeUnit.SECONDS).build();

? ? ? ? return client;

? }

public KeyManager[] getClientKeyManager() throws Exception {

// -----------客觀端證書-----------------

KeyManager[] clientkeyManagers = null;

if (SwpConfig.REQ_TYPE == 3) {

try {

char[] pwd = p12Pwd.toCharArray();

KeyStore keyStore = KeyStore.getInstance("PKCS12");

InputStream astream = SwpConfig.getAppContext().getAssets()

.open(clientP12);

keyStore.load(astream, pwd);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");

kmf.init(keyStore, pwd);

clientkeyManagers = kmf.getKeyManagers();

Log.e("ssl",clientkeyManagers.length+"");

} catch (Exception e) {

}

}

if(clientkeyManagers==null){

throw new IllegalAccessError("clientkeymanagers do not null");

}

return clientkeyManagers;

}


? static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {

? ? ? public java.security.cert.X509Certificate[] getAcceptedIssuers() {

? ? ? ? ? return new X509Certificate[0];

? ? ? }

? ? ? public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {

? ? ? ? ? return true;

? ? ? }

? ? ? public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {

? ? ? ? ? return true;

? ? ? }

? ? ? public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)

? ? ? ? ? ? ? throws java.security.cert.CertificateException {

? ? ? ? ? return;

? ? ? }

? ? ? public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)

? ? ? ? ? ? ? throws java.security.cert.CertificateException {

? ? ? ? ? return;

? ? ? }

}

}



你可以直接把以上的代碼復(fù)制到你的應(yīng)用中,但是有些地方需要你注意一下



你要改的就是這兩個(gè)代碼,第一個(gè)參數(shù)是你你們公司自簽名的文件在你項(xiàng)目的哪個(gè)位置

第二個(gè)參數(shù)是 你們公司簽名的密碼

注意:我的簽名文件是.p12,如果你的不是,那可以參考一下其它人的代碼。我對這個(gè)原理也不是很懂。只是實(shí)現(xiàn)了公司的需求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 4,178評論 2 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Https請求 一、訪問HTTPS站點(diǎn) 兩種方法來模擬發(fā)送HTTP請求,訪問HTTP站點(diǎn)。一種方式是通過java....
    Gothrow閱讀 2,340評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評論 18 399
  • 之一 月亮灣里繡月亮,斜陽島上畫斜陽; 滴水丹屏五彩池,芭蕉葉下影成雙。 之二 相思湖畔柳絲漾,三婆廟里祈安香; ...
    劉海峰閱讀 505評論 0 0

友情鏈接更多精彩內(nèi)容