安卓https双向认证(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";//客户端要给服务器端认证的证书

private static final StringKEY_STORE_TRUST_PATH ="server.p12";//客户端验证服务器端的证书库

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 {

// 服务器端需要验证的客户端证书

        KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);

        // 客户端信任的服务器端证书

        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;

}


安卓https双向认证(xutils3)_第1张图片
安卓https双向认证(xutils3)_第2张图片

说明:

client.p12, 这是客户端证书

server.p12, 这是服务端证书

其余的代码就不解释了,都是固定的。


问题:android load BKS error: wrong version of key store

按照字面的意思是:安卓加载BKS错误:版本问题

首先,你必须知道BKS是什么,它是证书的一种类型。

而且,我们在debug中也可以轻松的找到问题出现的具体代码位置


安卓https双向认证(xutils3)_第3张图片

综上,也就可以看出是服务端的证书库类型是非bks类型


接下来就简单了,类型不匹配,那就装换一下咯

我在这里用到了这个工具

安卓https双向认证(xutils3)_第4张图片


用法:

安卓https双向认证(xutils3)_第5张图片
打开类型不正确的证书文件


安卓https双向认证(xutils3)_第6张图片
这里需要输入密码


安卓https双向认证(xutils3)_第7张图片
密码校验成功后会出现这个界面



安卓https双向认证(xutils3)_第8张图片
选择BKS-V1后保存就OK了

注意事项

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

出现这个问题呢,是因为代码问题,请参照上文代码,可以直接复制


2、安卓系统版本兼容问题,我这里暂未考虑。


3、如有错误,请指出。


代码参照这位老板的:http://blog.csdn.net/u012874222/article/details/50339259

他写的十分详细,我这里只是简单的叙述一下。建议看一看。


咳咳,会不会侵权,哈哈,如有请指出。

你可能感兴趣的:(安卓https双向认证(xutils3))