前面我們面對https自簽證書的方式是在客戶端放入一份服務器的證書文件熊响,在訪問網(wǎng)絡的情況下使用去驗證猾编。但是實際上通過瀏覽器訪問時逝薪,如果該網(wǎng)站為HTTPS網(wǎng)站缚窿,瀏覽器會自動檢測系統(tǒng)中是否存在該網(wǎng)站的信任證書, 如果沒有信任證書盛杰,瀏覽器一般會拒絕訪問但是也會有一個繼續(xù)訪問的操作挽荡,但地址欄是紅色,給予用戶警示作用即供, 即客戶端驗證服務端并不是強制性的定拟,可以沒有服務端的信任證書,當然是否繼續(xù)訪問完全取決于用戶自己逗嫡。 如果要去除地址欄的紅色警告,需要導入服務端提供的證書到瀏覽器中青自。
雙向認證即服務端要驗證客戶端的證書,客戶端要驗證服務端的證書驱证,缺一不可延窜。前面的方式等同于只做了客戶端驗證服務端的證書,現(xiàn)在我們要加上一個證書在客戶端抹锄,在訪問的時候帶上這個證書逆瑞,如果這個客戶端的證書在服務器的證書庫中荠藤,則驗證通過,可以繼續(xù)訪問获高,反之無法顯示頁面哈肖,因為服務器無法向客戶端一樣自己選擇信任該客戶端所以無法繞過。
appClient.p12 客戶端的證書
appServer.p12 服務端的證書 證書類型都是PKCS12
配置證書的代碼如下
private OkHttpClient.BuildersetCertificates1(OkHttpClient.Builder client, InputStream... certificates) {
try {
// 服務器端需要驗證的客戶端證書 PKCS12
keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);
// 客戶端信任的服務器端證書
trustStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);
InputStream ksIn = getAssets().open("appClient.p12");
InputStream tsIn = getAssets().open("appServer.p12");
try {
keyStore.load(ksIn, clientPasssword.toCharArray());
trustStore.load(tsIn, serverPassword.toCharArray());
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
ksIn.close();
}catch (Exception ignore) {
}
try {
tsIn.close();
}catch (Exception ignore) {
}
}
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore,clientPasssword.toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
X509TrustManager trustManager = Platform.get().trustManager(sslSocketFactory);
client.sslSocketFactory(sslSocketFactory, trustManager);
}catch (KeyManagementException e) {
e.printStackTrace();
}catch (UnrecoverableKeyException e) {
e.printStackTrace();
}catch (KeyStoreException e) {
e.printStackTrace();
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
return client;
}