安卓https雙向認(rèn)證(xutils3)

1、先上代碼



private static final StringKEY_STORE_TYPE_BKS ="bks";//證書類型 固定值

private static final StringKEY_STORE_TYPE_P12 ="PKCS12";//證書類型 固定值

private static final StringKEY_STORE_CLIENT_PATH ="client.p12";//客戶端要給服務(wù)器端認(rèn)證的證書

private static final StringKEY_STORE_TRUST_PATH ="server.p12";//客戶端驗證服務(wù)器端的證書庫

private static final StringKEY_STORE_PASSWORD ="123456"客戶端證書密碼

private static final StringKEY_STORE_TRUST_PASSWORD ="123456";//客戶端證書庫密碼

/**

* 獲取Https的證書

*

* @param context Activity(fragment)的上下文

* @return SSL的上下文對象

*/

private static SSLContextgetSSLContext(Context context) {

try {

// 服務(wù)器端需要驗證的客戶端證書

? ? ? ? KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);

? ? ? ? // 客戶端信任的服務(wù)器端證書

? ? ? ? KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS);

? ? ? ? InputStream ksIn = context.getResources().getAssets().open(KEY_STORE_CLIENT_PATH);

? ? ? ? InputStream tsIn = context.getResources().getAssets().open(KEY_STORE_TRUST_PATH);

? ? ? ? try {

keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray());

? ? ? ? ? ? trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.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("X509");

? ? ? ? keyManagerFactory.init(keyStore, KEY_STORE_PASSWORD.toCharArray());

? ? ? ? sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

? ? ? ? return sslContext;

? ? }catch (Exception e) {

BNLog.e("tag", e.getMessage(), e);

? ? }

return null;

}


說明:

client.p12, 這是客戶端證書

server.p12, 這是服務(wù)端證書

其余的代碼就不解釋了,都是固定的。


問題:android load BKS error: wrong version of key store

按照字面的意思是:安卓加載BKS錯誤:版本問題

首先,你必須知道BKS是什么,它是證書的一種類型。

而且,我們在debug中也可以輕松的找到問題出現(xiàn)的具體代碼位置


綜上,也就可以看出是服務(wù)端的證書庫類型是非bks類型


接下來就簡單了,類型不匹配,那就裝換一下咯

我在這里用到了這個工具


用法:

打開類型不正確的證書文件


這里需要輸入密碼


密碼校驗成功后會出現(xiàn)這個界面



選擇BKS-V1后保存就OK了

注意事項

1、Javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: Failure in SSL library, usually a protocol error

出現(xiàn)這個問題呢,是因為代碼問題,請參照上文代碼,可以直接復(fù)制


2、安卓系統(tǒng)版本兼容問題,我這里暫未考慮。


3、如有錯誤,請指出。


代碼參照這位老板的:http://blog.csdn.net/u012874222/article/details/50339259

他寫的十分詳細(xì),我這里只是簡單的敘述一下。建議看一看。


咳咳,會不會侵權(quán),哈哈,如有請指出。

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

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