okhttp作為Android最主要的網(wǎng)絡(luò)請(qǐng)求框架之一秦忿,估計(jì)從事Android開發(fā)的小伙伴沒有不知道的麦射;
okhttp一個(gè)簡(jiǎn)單請(qǐng)求:
Request request = new Request.Builder().get().url("https://www.baidu.com").build();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient client = builder.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
上面這段代碼大家都見過,沒啥技術(shù)難度灯谣。
在開發(fā)中潜秋,為了網(wǎng)絡(luò)安全會(huì)使用https,數(shù)字證書來保證網(wǎng)絡(luò)安全胎许,數(shù)字證書okhttp默認(rèn)會(huì)提供的峻呛,但大型項(xiàng)目一般都會(huì)使用自己的證書罗售,如何給okhttp添加證書呢?
直接上代碼:
CertificateFactory factory = CertificateFactory.getInstance("X.509");//設(shè)置證書類型钩述,X.509是一種格式標(biāo)準(zhǔn)
//證書類型
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());//KeyStore 是一個(gè)存儲(chǔ)了證書的文件寨躁。文件包含證書的私鑰,公鑰和對(duì)應(yīng)的數(shù)字證書的信息牙勘。
keyStore.load(null, null);
InputStream stream;
Certificate certificate;//Certificate是證書信息封裝的一個(gè)bean類
if (cerPathList != null && !cerPathList.isEmpty()) {
for (int i = 0; i < cerPathList.size(); i++) {
stream = context.getAssets().open(cerPathList.get(i));
certificate = factory.generateCertificate(stream);
//證書類型
keyStore.setCertificateEntry("alias" + i, certificate);//將每個(gè)證書封裝類以鍵值對(duì)的方式存入KeyStore
}
}
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);//通過keyStore得到信任管理器
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "pwd".toCharArray());//通過keyStore得到密匙管理器
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();//拿到SSLSocketFactory
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
return null;
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
okHttpClient.sslSocketFactory(sslSocketFactory, trustManager)//設(shè)置ssl證書
okHttpClient.build();
總結(jié)一下职恳,
- 首先準(zhǔn)備好 我們的證書,放在Assets目錄下方面;
- 讀取證書信息用封裝成Certificate類放钦,存入keyStore中;
- 獲取信任管理器TrustManagerFactory恭金, 秘鑰管理器KeyManagerFactory最筒,生成SSLContext;
- 通過SSLContext得到SSLSocketFactory蔚叨, 通過okHttpClient.builder的sslSocketFactory添加到okhttp床蜘;