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

Java 我有一个密钥库文件,如何在Android应用程序中为sslContext提供密钥管理器?,java,android,authentication,ssl,client,Java,Android,Authentication,Ssl,Client,更新:至于我最初的问题,结果是对java.security.KeyStore.getCertificate(别名)的调用实际上返回了X509Certificate。但这不是问题所在 (请容忍我,我对这张证书还不熟悉。) 只要不需要经过身份验证的客户端,我就设法连接到我的(自签名)启用SSL的服务器。当我确实需要clientAuth时,我的应用程序会产生“例程:SSL3_读取_字节:sslv3警报握手失败(external/openssl/ssl/s3_pkt.c)”(也有描述)……对于一些人来说

更新:至于我最初的问题,结果是对java.security.KeyStore.getCertificate(别名)的调用实际上返回了X509Certificate。但这不是问题所在

(请容忍我,我对这张证书还不熟悉。)

只要不需要经过身份验证的客户端,我就设法连接到我的(自签名)启用SSL的服务器。当我确实需要clientAuth时,我的应用程序会产生“例程:SSL3_读取_字节:sslv3警报握手失败(external/openssl/ssl/s3_pkt.c)”(也有描述)……对于一些人来说,解决方法是从BKS切换到PKCS12,这对我不起作用

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

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


但是根据
X509KeyManager
接口,我应该返回
X509Certificate
如何使用密钥库创建密钥库?您可以将
密钥库
与客户端证书一起用于客户端身份验证,而无需显式创建
密钥管理器就像这样:

keystorekeystore=KeyStore.getInstance(“BKS”);
InputStream is=getResources().openRawResource(R.raw.client);
load(是“yourkestorepassword.toCharArray());
is.close();
KeyManagerFactory KeyManagerFactory=KeyManagerFactory.getInstance(“X509”);
init(keyStore,“yourkystorepassword.toCharArray());
SSLContext SSLContext=SSLContext.getInstance(“TLS”);
sslContext.init(keyManagerFactory.getKeyManagers(),trustManagers,null);
还要确保服务器信任您的客户端证书。

代码

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);
未验证。我已测试,错误为:

X509 KeyManagerFactory不可用


在发布代码之前,确保已经测试过。

这是我第一次尝试的方式(基于关于Android开发人员的“提供特定于应用程序的X509KeyManager”文章)但是遇到了握手问题。这让我觉得kmf出于某种原因未能提交正确的密钥存储条目。但你的最后一句话是我从未意识到的:可能服务器确实检查了正确的证书,但根本不喜欢它的气味。鉴于我的密钥存储的内容未“批准”对任何一个CA来说,这都是有道理的……我会调查一下,如果真的是这样,我会记下你的回答。:)该死,你最后一件事是对的。将我的自定义.truststore JKS添加到Tomcat HTTPS连接器,问题已解决。:)谢谢!对于遇到此答案的任何人,请确保使用导入
javax.net.ssl.TrustManagerFactory
,而不是
com.sun.net.ssl.TrustManagerFactory
;后者现在已被弃用。干杯。我复制/粘贴了您的解决方案,但“TrustManager”没有定义