[英]I have a keystore file, how do I provide keyManagers to sslContext in Android app?
更新:至於我最初的問題,事實證明對 java.security.KeyStore.getCertificate(alias) 的調用確實返回 X509Certiciate。 但這不是問題。
(請耐心等待,我是這個證書的新手。)
我設法連接到我的(自簽名)啟用 SSL 的服務器,只要我不需要經過身份驗證的客戶端。 當我確實需要 clientAuth 時,我的應用程序會產生“routines:SSL3_READ_BYTES:sslv3 警報握手失敗(external/openssl/ssl/s3_pkt.c”... (也在這里描述)...對於某些人來說,治療方法是從 BKS 切換到 PKCS12 ,這對我不起作用。
所以現在我正在嘗試實現我自己的X509KeyManager
(如這里建議的那樣),將它交給sslContext.init([keyManager], trustManagers, null)
。
如果我理解正確,sslContext 將向我的 keyManager(s) 詢問給定別名的證書鏈和/或私鑰。 (每當它詢問選擇什么別名時,我都會提供我的硬編碼。)
但是根據X509KeyManager
接口,我應該返回X509Certificate
。 如何使用密鑰庫創建一個?
您可以使用帶有客戶端證書的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);
還要確保您的服務器信任您的客戶端證書。
編碼
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 不可用。
在發布代碼之前,請確保已經過測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.