2013-02-28 98 views
11

Hy Guys!我正在嘗試使用bouncycastle創建x.509證書,該證書應由另一證書籤名並存儲爲PEM base 64格式。使用帶證書路徑的bouncycastle創建x.509證書(cert鏈)

我已經有自簽證書(公鑰和私鑰)。現在我想創建一個新的簽名並使用現有的自簽名證書籤名。

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); 
keyPairGenerator.initialize(1024, new SecureRandom()); 
KeyPair keyPair = keyPairGenerator.generateKeyPair(); 

X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); 
X500Principal dnName = new X500Principal("CN=Sergey"); 
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis())); 
certGen.setSubjectDN(dnName); 
certGen.setIssuerDN(caCert.getSubjectX500Principal()); 
certGen.setNotBefore(validityBeginDate); 
certGen.setNotAfter(validityEndDate); 
certGen.setPublicKey(keyPair.getPublic()); 
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption"); 

certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert)); 
certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(keyPair.getPublic())); 

X509Certificate cert = certGen.generate(caCertPrivateKey, "BC"); 

驗證通過沒有例外,從我的角度來看,它已成功CACERT簽署意味着:

cert.verify(caCert.getPublicKey()); 

然後我把它解碼成PEM基地64:

PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out)); 
pemWriter.writeObject(cert); 
pemWriter.flush(); 

我在輸出中得到這樣的東西:

----- BEGIN CERTIFICATE -----

MIIDDjCCAnegAwIBAgIBFDAN ........

----- END CERTIFICATE -----

當我打開它,我看到了未來:

enter image description here

爲什麼在caCert成功簽署認證鏈時沒有認證鏈?

我的代碼中需要更改哪些內容才能看到認證鏈?

回答

8

我能找到解決方案。實際上,代碼按預期工作。我沒有看到證書鏈,因爲我的caRoot證書沒有添加到可信存儲區。在將我的自簽名證書添加到受信任的根認證中心後,我按照預期看到了整個認證鏈。