我有一个密钥库文件,如何在 Android 应用程序中为 sslContext 提供 keyManagers?
I have a keystore file, how do I provide keyManagers to sslContext in Android app?
更新:至于我原来的问题,事实证明调用 java.security.KeyStore.getCertificate(别名) 实际上确实是 return X509Certiciate。不过那不是问题。
(请耐心等待,我是证书方面的新手。)
我设法连接到我的(自签名)启用 SSL 的服务器,只要我不需要经过身份验证的客户端。当我确实需要 clientAuth 时,我的应用程序会产生 "routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c"...(也描述为 here)...对于某些人来说,解决方法是从 BKS 切换到 PKCS12,那对我不起作用。
所以现在我正在尝试实现我自己的 X509KeyManager
(按照建议 here),将其交给 sslContext.init([keyManager], trustManagers, null)
。
如果我理解正确,sslContext 将向我的 keyManager 询问证书链 and/or 给定别名的私钥。 (每当它询问选择什么别名时,我都会提供我的硬编码别名。)
但是根据X509KeyManager
界面我应该returnX509Certificate
。 如何使用密钥库创建一个?
您可以将 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.security.KeyStore.getCertificate(别名) 实际上确实是 return X509Certiciate。不过那不是问题。
(请耐心等待,我是证书方面的新手。)
我设法连接到我的(自签名)启用 SSL 的服务器,只要我不需要经过身份验证的客户端。当我确实需要 clientAuth 时,我的应用程序会产生 "routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c"...(也描述为 here)...对于某些人来说,解决方法是从 BKS 切换到 PKCS12,那对我不起作用。
所以现在我正在尝试实现我自己的 X509KeyManager
(按照建议 here),将其交给 sslContext.init([keyManager], trustManagers, null)
。
如果我理解正确,sslContext 将向我的 keyManager 询问证书链 and/or 给定别名的私钥。 (每当它询问选择什么别名时,我都会提供我的硬编码别名。)
但是根据X509KeyManager
界面我应该returnX509Certificate
。 如何使用密钥库创建一个?
您可以将 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);
还要确保您的服务器信任您的客户端证书。