我有一个密钥库文件,如何在Android应用程序中为sslContext提供keyManagers?

Jar*_*uba 9 java authentication ssl client android

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

(请跟我说,我是这个证书的新手.)

我设法连接到我的(自签名)启用SSL的服务器,只要我不需要经过身份验证的客户端.当我确实需要clientAuth我的应用程序产生"例程:SSL3_READ_BYTES:sslv3警报握手失败(外部/ openssl/ssl/s3_pkt.c"......(也在这里描述)...对于一些人来说,治愈是从BKS切换到PKCS12那对我不起作用.

所以现在我正在尝试实现我自己的X509KeyManager(如此处所示),将其交给sslContext.init([keyManager], trustManagers, null).

如果我理解正确,sslContext将向我的keyManager询问给定别名的证书链和/或私钥.(每当它询问选择哪个别名时,我都提供我的硬编码.)

但根据X509KeyManager我应该返回的界面X509Certificate.如何使用密钥库创建一个?

Tom*_*mik 14

您可以使用a 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);
Run Code Online (Sandbox Code Playgroud)

还要确保您的服务器信任您的客户端证书.

  • 对于遇到此答案的任何人,请务必使用导入`javax.net.ssl.TrustManagerFactory`而不是`com.sun.net.ssl.TrustManagerFactory`; 后者现已弃用.干杯. (6认同)
  • 我复制/粘贴您的解决方案,但“trustManagers”未定义 (2认同)