我有一个keystore文件,如何在Android应用程序中提供keyManagers到sslContext?

更新:至于我原来的问题,事实certificate,调用java.security.KeyStore.getCertificate(别名)确实返回X509Certiciate。 这不是问题。

(拜托我,我是新来的这个证书的东西。)

我设法连接到我的(自签名的)启用了SSL的服务器,只要我不需要validation客户端。 当我需要clientAuth我的应用产生“例程:SSL3_READ_BYTES:sslv3警报握手失败(外部/ openssl / ssl / s3_pkt.c”… ( 这里也描述)…对于一些治愈是从BKS切换到PKCS12 ,那对我不起作用。

所以现在我试图实现我自己的X509KeyManager (如这里所build议的),把它交给sslContext.init([keyManager], trustManagers, null)

如果我理解正确,sslContext会向我的密钥pipe理器询问给定别名的证书链和/或私钥。 (每当询问什么别名时,我都会提供硬编码的)。

但根据X509KeyManager接口,我应该返回X509Certificate如何使用密钥库创build一个?

Solutions Collecting From Web of "我有一个keystore文件,如何在Android应用程序中提供keyManagers到sslContext?"

您可以将KeyStore与您的客户端证书一起用于客户端身份validation,而无需显式创buildKeyManager 。 代码应该是这样的:

 KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream is = getResources().openRawResource(R.raw.client); keyStore.load(is, "yourKeyStorePassword".toCharArray()); is.close(); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509"); keyManagerFactory.init(keyStore, "yourKeyStorePassword".toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManagerFactory.getKeyManagers(), trustManagers, null); 

另外请确保您的服务器信任您的客户端证书。