安卓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;

}


说明:

client.p12, 这是客户端证书

server.p12, 这是服务端证书

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


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

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

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

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


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


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

我在这里用到了这个工具


用法:

打开类型不正确的证书文件


这里需要输入密码


密码校验成功后会出现这个界面



选择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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。