2010-08-24 73 views
6

大家好,我試圖將我在java程序中生成的PKCS#8私鑰轉換爲PEM編碼文件。在java中將PKCS#8私鑰轉換爲PEM

Security.addProvider(new BouncyCastleProvider()); 
SecureRandom rand = new SecureRandom(); 
JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();   
keyPairGen.initialize(2048, rand); 
KeyPair keyPair = keyPairGen.generateKeyPair(); 

PEMWriter privatepemWriter = new PEMWriter(new FileWriter(new File(dir + "private.key"))); 
privatepemWriter.writeObject(keyPair.getPrivate()); 

運行程序後,我有兩種格式的私鑰和一個公鑰(代碼不顯示,因爲它的作品)。然後我使用這個openssl命令將private.key轉換回pem格式的文件。

openssl pkcs8 -nocrypt -inform DER -in private.key -out private2.pem 

當我比較private.pem和private2.pem它們是不同的,顯然,當我嘗試使用它private.pem說,這不是一個有效的文件。

我錯過了什麼步驟才能正確將此私鑰轉換爲我需要的PEM格式?我不能在我的程序中使用OpenSSL,否則我會簡單地添加該函數調用。我在這個程序中可以訪問BouncyCastle庫,所以也許它有一個我忽略的解決方案。

+0

你試圖與哪些軟件進行互操作? (當你說,「它說這不是一個有效的文件,」它是什麼?) – erickson 2010-08-25 01:09:58

+0

當我嘗試使用private.key進行各種操作時,Curl和OpenSSL也說同樣的事情。 – Hiro2k 2010-08-25 14:12:22

+1

missing privatepemWriter.close(); //正確刷新。謝謝。 – 2010-11-17 12:53:30

回答

9

您可以使用Bouncycastle中的PEMWriter類。

+0

感謝這個工作出色,我能夠刪除我所有的冗餘代碼!閱讀源代碼幫助我找出要傳遞的對象。 http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/openssl/PEMWriter.java.htm – Hiro2k 2010-08-25 14:33:59

+2

是的,bouncycastle文檔很差,但源代碼非常簡單讀書! – 2010-08-26 00:41:40

2

使用標頭:

-----BEGIN PRIVATE KEY----- 

…和頁腳:

-----END PRIVATE KEY----- 

注意,「RSA」被冷落—的Java代碼使用PKCS#8編碼的私鑰,該編碼包括算法。

您顯示的openssl命令將DER格式的標準PKCS#8密鑰轉換爲PEM格式的專有OpenSSL密鑰。要保留PKCS#8格式,但要將DER轉換爲PEM,請添加-topk8選項。然後,OpenSSL輸出應該與您的Java代碼生成的內容相匹配。

如果您需要生成OpenSSL密鑰而不是PKCS#8,這是可能的,但您必須使用BouncyCastle ASN.1庫創建自己的OpenSSL結構並對其進行編碼。請澄清,如果這是你需要的。

+0

是的,我想要的是生成OpenSSL密鑰而不是PKCS#8。我看了一下PEMWriter的波紋管,但是我不知道這是否能夠滿足我的需求。 – Hiro2k 2010-08-25 00:39:30

+1

它會傷害你嘗試一下,看看? – 2010-08-25 02:03:12

5

OpenSSL使用它自己的格式實際上是唯一使這個具有挑戰性的事情。幸運的是,充氣城堡PEMWriter使這一切變得簡單,但界面並沒有很好的記錄。我通過郵件列表搜索發現了一些代碼。我在下面調整它:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(2048); 
KeyPair keyPair = keyGen.generateKeyPair(); 
StringWriter stringWriter = new StringWriter(); 
PEMWriter pemWriter = new PEMWriter(stringWriter); 
pemWriter.writeObject(keyPair.getPrivate()); 
pemWriter.close(); 
privateKeyString = stringWriter.toString(); 
+0

感謝您的工作示例。 – 2013-01-31 08:32:14