更新:关于我的原始问题,事实证明对java.security.KeyStore.getCertificate(alias)的调用实际上返回了X509Certiciate。那不是问题。

(请多多包涵,我是这个证书的新手。)

只要我不需要经过身份验证的客户端,就可以设法连接到我的(自签名)启用SSL的服务器。当我确实需要clientAuth时,我的应用程序会产生“例程:SSL3_READ_BYTES:sslv3警报握手失败(外部/openssl/ssl/s3_pkt.c” ...(也描述为here)...对于某些情况,解决方法是从BKS切换到PKCS12 ,这对我不起作用。

因此,现在我尝试实现自己的X509KeyManager(如建议的here),以将其交给sslContext.init([keyManager], trustManagers, null)

如果我正确理解,则sslContext会向我的keyManager请求证书链和/或给定别名的私钥。 (每当询问要选择哪种别名时,我都会提供我的硬编码别名。)

但是根据X509KeyManager接口(interface),我应该返回X509Certificate如何使用 keystore 创建一个?

最佳答案

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

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);

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

关于java - 我有一个 keystore 文件,如何在Android应用程序中为sslContext提供keyManager?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28919797/

10-13 04:36