簡體   English   中英

我有一個密鑰庫文件,如何在 Android 應用程序中為 sslContext 提供密鑰管理器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM