1

我能夠使用Android或BouncyCastle庫從CA簽名的X509客戶端證書中提取證書鏈信息嗎?從Android/BouncyCastle中籤名的X509證書(CSR響應)中提取證書鏈信息

我有一個Android客戶端從受信任的服務器接收CA簽名的X509證書。我想將已簽名的客戶端證書和我的私鑰保存到PKCS12(.p12)文件。我目前通過創建一個KeyStore對象並添加證書和私鑰來完成此操作。當我使用KeyStore.setKeyEntry()方法添加客戶端PrivateKey時,Certificate[] chain是最後一個參數,它當前僅包含客戶端證書。 這是否會阻止我的證書被驗證,因爲我沒有Certificate[] chain中的CA證書?如果是,是否有可能使用從簽署的X509Certificate中提取的信息填充證書鏈?

大多數示例似乎都是從PEM文件,BKS信任庫中加載CA鏈,或者已經有權訪問證書列表。

以下是我有:提前

X509Certificate cert;  // signed client cert 
    PrivateKey pkey;   // client private key 
    String password; 

    KeyStore store; 
    store = KeyStore.getInstance("PKCS12", "BC"); 
    store.load(null, null); 

    // adding the signed cert 
    store.setCertificateEntry("Client certificate", cert); 

    // creating the cert chain 
    X509Certificate[] chain = new X509Certificate[1]; 
    chain[0] = cert; 
    // add rest of the certs in the chain here 

    // adding the private key 
    store.setKeyEntry("Client private key", pkey, password.toCharArray(), chain); 

    FileOutputStream fos; 
    fos = openFileOutput("clientCredentials.p12", Context.MODE_PRIVATE); 
    store.store(fos, password.toCharArray()); 
    fos.flush(); 
    fos.close(); 

謝謝!

回答

0

CA證書不包含在您的簽名證書中。你必須從某個地方獲取它們(預安裝,從受信任的服務器下載等)。至於沒有安裝完整的鏈,如果驗證者已經有權訪問必要的CA證書,他們總是可以驗證您的最終實體證書。你打算如何使用你的密鑰和證書?

順便說一句,您致電setCertificateEntry()創建一個可信任的證書條目,這可能不是您想要的最終實體證書。

+0

感謝您的回覆!請告訴我,如果我正確理解這一點。在驗證證書時,驗證者還必須信任證書正在使用的鏈(通過預安裝,下載等)?我想如果你還沒有信任發行者,你不能驗證證書。 – aspergillusOryzae

+0

我正在使用客戶端憑據與我的服務器建立可信的SSL連接。 (我已經有了創建CSR的應用程序,獲得由我的服務器簽名的客戶端證書,並且上面簽名的證書是服務器響應。我試圖在客戶端Android設備上存儲pkey和簽名證書。)對於'setCertificateEntry ()'我應該使用'setKeyEntry()'並且傳遞X509Certificate'getEncoded()'字節嗎?我基本上試圖實現[OpenSSL的PKCS12_create函數](http://www.openssl.org/docs/crypto/PKCS12_create.html)。再次感謝@ nikolay-elenkov! – aspergillusOryzae

+0

對,驗證者需要相信發行者CA,這是他們的信任錨。 'setKeyEntry()'應該爲你完成這項工作:你將得到一個帶有密鑰和證書的PKCS#12文件,並且沒有捆綁CA證書。 –