2014-09-29 54 views
2

我使用EJBCA從CommonName生成證書。在java代碼中,我已經生成了私鑰和公鑰,然後是用於生成證書的csr。 現在我將證書保存爲PEM格式(.cer),但我也需要私鑰,所以我想用.pfx或p12擴展名保存。我能怎麼做? 這是我的實際代碼生成證書:將pfx證書保存到java代碼文件(ejbca)

KeyPair keys; 
    try { 
     keys = KeyTools.genKeys("1024", AlgorithmConstants.KEYALGORITHM_RSA); 

     //SAVE PRIVKEY 
     //PrivateKey privKey = keys.getPrivate(); 
     //byte[] privateKeyBytes = privKey.getEncoded(); 
     PKCS10CertificationRequest pkcs10 = new PKCS10CertificationRequest("SHA256WithRSA", 
       CertTools.stringToBcX509Name("CN=NOUSED"), keys.getPublic(), null, keys.getPrivate()); 
     //Print Privatekey 
     //System.out.println(keys.getPrivate().toString()); 
     CertificateResponse certenv = ws.certificateRequest(user1, 
                   new String(Base64.encode(pkcs10.getEncoded())), 
                   CertificateHelper.CERT_REQ_TYPE_PKCS10, 
                   null, 
                   CertificateHelper.RESPONSETYPE_CERTIFICATE); 

     //Certificate certenv = ejbcaraws.pkcs10Req("WSTESTUSER1","foo123",new 
     //String(Base64.encode(pkcs10.getEncoded())),null); 

     return certenv.getCertificate(); 
    }catch (Exception e) {} 

以及與此我保存證書:

File file = new File(path+"/"+ x509Cert.getSubjectDN().toString().replace("CN=", "") +".cer"); 

     FileOutputStream os = new FileOutputStream(file); 
     //os.write("-----BEGIN CERTIFICATE-----\n".getBytes("US-ASCII")); 
     //os.write(Base64.encode(x509Cert.getEncoded(), true)); 
     //os.write("-----END CERTIFICATE-----".getBytes("US-ASCII")); 
     //os.close(); 

     PEMWriter pemWriter = new PEMWriter(new PrintWriter(os)); 
     pemWriter.writeObject(x509Cert); 
     pemWriter.flush(); 
     pemWriter.close(); 

回答

1

我從來沒有使用EJBCA,但是如果你有證書和私鑰,你想要創建一個PKCS12,您可以使用setKeyEntry(String alias,byte[] key,Certificate[] chain)方法從java.security.KeyStore添加條目,然後使用store(OutputStream stream, char[] password)方法將PKCS12保存到文件(有關更多詳細信息,請參閱API)。你的代碼可能是這樣的:

import java.io.FileOutputStream; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.cert.Certificate; 

public class SamplePKCS12 { 

    public static void main(String args[]) throws Exception { 

     String alias = // the alias for your key... 
     PrivateKey key = // your private key 
     Certificate[] chain = // an array with your EE certificate to your CA issuer 
     // create keystore  
     KeyStore keystore = KeyStore.getInstance("PKCS12"); 
     // add your key and cert   
     keystore.setKeyEntry(alias, key.getEncoded(), chain); 
     // save the keystore to file 
     keystore.store(new FileOutputStream("/tmp/keystore.p12"), "yourPin".toCharArray()); 
    } 
} 

注意我想你有你的證書和你的私鑰,就像你在你的問題中說的那樣。要使用PKCS12,您需要SunJSSE提供程序(通常默認情況下會裝入),或者可以使用BouncyCastle提供程序。

希望這會有所幫助,

+0

我使用KeyPair在代碼中生成公鑰/私鑰對,並創建證書。現在,稍後在不同的請求中,我希望檢索在不同請求中生成的p12。在這種情況下,我該如何生成p12? – sbose 2016-02-05 11:14:25

+0

@sbose這是一個不同的問題......如果我理解的很好,你想從之前創建的文件加載PKCS12不是嗎?那麼你只需要使用'keystore.load'方法來加載文件(例如使用'fileInputStream')。基本上類似於:'KeyStore kstore = KeyStore.getInstance(「PKCS12」); (new FileInputStream(「/ somePath/yourP12File.p12」),「yourPassword」.toCharArray()); ...' – albciff 2016-02-05 11:50:47

+0

感謝您的回覆。不,從以前生成的證書創建一個pkcs12。證書存在於CertificateData表中的數據庫中。 – sbose 2016-02-05 11:56:09