2013-01-20 137 views
2

我已經創建了一個帶有Java代碼的自簽名證書並添加到KeyStore中。現在我想將創建的私鑰和證書導出爲PEM格式的文​​件。沒有任何第三方庫可以實現這一點嗎?以下是我用於創建自簽證書的代碼。以PEM格式轉換私鑰

public void createSelfSignedSSLCertificate() { 
    try {    
     final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null); 
     final X500Name x500Name = 
      new X500Name(commonName, organizationalUnit, organization, city, state, country); 
     keypair.generate(keysize); 
     final PrivateKey privKey = keypair.getPrivateKey(); 
     final X509Certificate[] chain = new X509Certificate[1]; 
     chain[0] = keypair.getSelfCertificate(x500Name, new Date(), validity * 24 * 60 * 60); 
     final String alias = JettySSLConfiguration.SSL_CERTIFICATE_ALIAS; 
     keyStore.setKeyEntry(alias, privKey, keyStorePassword.toCharArray(), chain); 
    } catch (final Exception e) { 
     // Handle Exception 
    }  
} 

任何有關如何將密鑰和證書導出爲PEM格式文件的建議將非常有幫助。

+1

實際上沒有單一的「PEM」格式。當用base64編碼並且用'----- BEGIN '和'----- END '圍繞時,有各種不同的密碼結構被描述爲「PEM格式」。你需要明確你想要哪一個。 –

+1

除了使用一些不屬於J2SE API的內部'sun。*'軟件包,您應該考慮使用第三方庫。 – Bruno

回答

3

您使用Certificate.getEncoded()Key.getEncoded()來獲得DER並手動執行base 64編碼和頁眉/頁腳,例如,使用DatatypeConverter.printBase64Binary()或其他方式。例如:

certpem = "-----BEGIN CERTIFICATE-----\n" + 
      DatatypeConverter.printBase64Binary(chain[0].getEncoded())) + 
      "\n-----END CERTIFICATE-----\n"; 
keypem = "-----BEGIN RSA PRIVATE KEY-----\n" + 
      DatatypeConverter.printBase64Binary(privKey.getEncoded())) + 
      "\n-----END RSA PRIVATE KEY-----\n";