2014-06-06 70 views
1

生成證書(X509Certificate對象),我有它加載一個專用密鑰對象從私有RSA密鑰字符串如下:a類:的Java:從專用密鑰對象

X509EncodedKeySpec spec = new X509EncodedKeySpec(privKeyString.getBytes()); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey privateKey = kf.generatePrivate(spec); 

我覺得上面將努力獲得一個專用密鑰對象。但是,一旦我有私鑰,我也想從它生成一個X509Certificate對象。這是我嘗試之一,但該方法generateCertificate所期望的輸入流(包含從文件證書,我相信。),所以這是行不通的:

CertificateFactory f = CertificateFactory.getInstance("X.509"); 
    X509Certificate cert = f.generateCertificate(privateKey); // this doesn't work. 

有沒有一種方法來創建一個證書(理想情況下不會過期)只從一個PrivateKey對象或從我原來的私鑰字符串(privKeyString變量)?

謝謝

+0

我還要提到的是我使用的是私有密鑰字符串,它是按以下格式: http://ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/sample- priv-key.htm 我不確定是否需要在頂部和底部刪除「BEGIN」和「END」註釋,並在將字符串用作X509EncodedKeySpec中的參數之前執行base64.decode。 –

+1

您正在使用錯誤的術語,因此存在問題。您不會從privKeyString「生成」私鑰但加載密鑰。那麼,你既不能生成也不能加載你擁有的證書。你需要首先確定你需要什麼。 –

+0

以及我首先需要的是什麼?如果需要公鑰才能生成證書,則可以使用私鑰生成公鑰。這就是我問的問題,我需要什麼來生成證書? –

回答

4

事件的典型流程是類似如下:您生成一個密鑰對,這意味着一個私鑰和一個匹配的公鑰。私鑰是你的,你永遠不會分享它;這就是爲什麼它被稱爲私人。公鑰是你給別人的。發佈公鑰的一種常見格式是X.509證書。該證書包含公鑰和一些標識信息。此證書可以自簽名,也可以由其他機構簽署。

不幸的是,標準的Oracle Java庫不包含任何類來幫助您從公鑰生成X.509證書。您可以使用Oracle JDK附帶的名爲keytool的命令行工具來實現此目的。如果您必須以編程方式執行此操作,那麼Bouncycastle Java libraries包含一些類來完成此操作。例如,JcaX509v3CertificateBuilder可能是完成此任務的最簡單方法,與JcaContentSignerBuilder類一起。

這是一個使用Java 7和Bouncycastle版本1.50提供程序和PKIX庫的示例。

import java.io.FileOutputStream; 
import java.math.BigInteger; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.KeyStore; 
import java.security.cert.Certificate; 
import java.security.cert.X509Certificate; 
import java.util.Calendar; 
import java.util.Date; 

import org.bouncycastle.asn1.x500.X500Name; 
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; 
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; 
import org.bouncycastle.operator.ContentSigner; 
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; 

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

     // Generate a keypair 

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair kp = kpg.generateKeyPair(); 

     // Start creating a self-signed X.509 certificate with the public key 

     X500Name subjName = new X500Name("C=US, ST=NY, O=Certs_R_Us, [email protected]"); 
     BigInteger serialNumber = new BigInteger("900"); 
     Calendar cal = Calendar.getInstance(); 
     cal.set(2014, 6, 7, 11, 59, 59); 
     Date notBefore = cal.getTime(); 
     cal.add(Calendar.YEAR, 10); // Expires in 10 years 
     Date notAfter = cal.getTime(); 
     JcaX509v3CertificateBuilder x509Builder = new JcaX509v3CertificateBuilder(subjName, serialNumber, 
       notBefore, notAfter, subjName, kp.getPublic()); 

     // Create a signer to sign (self-sign) the certificate. 

     JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA256WITHRSA"); 
     ContentSigner signer = signerBuilder.build(kp.getPrivate()); 

     // Now finish the creation of the self-signed certificate. 

     JcaX509CertificateConverter converter = new JcaX509CertificateConverter(); 
     X509Certificate mySelfSignedCert = converter.getCertificate(x509Builder.build(signer)); 

     // Now create a KeyStore and store the private key and associated cert. 

     final char[] password = "password99".toCharArray(); 
     KeyStore ks = KeyStore.getInstance("JKS"); 
     ks.load(null, password); 

     KeyStore.PrivateKeyEntry privKeyEntry = new KeyStore.PrivateKeyEntry(kp.getPrivate(), 
       new Certificate[] {mySelfSignedCert}); 
     ks.setEntry("myRSAkey", privKeyEntry, new KeyStore.PasswordProtection(password)); 

     // Now save off the KeyStore to a file. 

     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream("MyKeys.jks"); 
      ks.store(fos, password); 
     } finally { 
      if (fos != null) { 
       fos.close(); 
      } 
     } 
    } 
}