天天看點

Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語

轉自 http://blog.csdn.net/happylee6688/article/details/42294037

上一篇文章講到了 Java 生成數字證書,使用的是第三方的元件 BC 。這篇文章也是介紹生成數字證書的,隻不過與上一篇不同的是,這篇采用的是 KeyStore 的存儲方式,導出的證書檔案格式為 pfx ,這種格式的證書不僅包含有公鑰,還包含有私鑰。從證書中就可以讀取到私鑰。

正文

廢話不多說,直接上内容。

與上一篇相同,這裡也是使用的 Bouncy Castle 提供的元件,不同的是,這裡的證書采用的是公鑰加密技術12号标準生成的,簡寫 PKCS12 。具體内容這裡就不再詳細的介紹了,有需要的童鞋們直接 Google 就行了。下面直接上代碼。

PKCS12Test (測試證書類)

[java]  view plain  copy  

Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語
Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語
  1. <span style="font-family:Comic Sans MS;font-size:12px;">package com.cacss.jsceu.core;  
  2. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  3. import org.bouncycastle.x509.X509V3CertificateGenerator;  
  4. import javax.security.auth.x500.X500Principal;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.math.BigInteger;  
  8. import java.security.*;  
  9. import java.security.cert.Certificate;  
  10. import java.security.cert.CertificateException;  
  11. import java.security.cert.X509Certificate;  
  12. import java.util.Date;  
  13. public class PKCS12Test {  
  14.     static {  
  15.         // 系統添加BC加密算法 以後系統中調用的算法都是BC的算法  
  16.         Security.addProvider(new BouncyCastleProvider());  
  17.     }  
  18.     public static void main(String args[]) throws NoSuchAlgorithmException,  
  19.             InvalidKeyException, SecurityException, SignatureException,  
  20.             KeyStoreException, CertificateException, IOException {  
  21.         String certPath = "d:/jason.pfx";  
  22.         // 建立KeyStore  
  23.          KeyStore store = KeyStore.getInstance("PKCS12");  
  24.          store.load(null, null);  
  25.         KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");  
  26.         kpg.initialize(2048);  
  27.         KeyPair keyPair = kpg.generateKeyPair();  
  28.         // 組裝證書  
  29.         String issuer = "C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN=SICCA";  
  30.         String subject = issuer;  
  31.         X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();  
  32.         certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));  
  33.         certGen.setIssuerDN(new X500Principal(issuer));  
  34.         certGen.setNotBefore(new Date(System.currentTimeMillis() - 50000));  
  35.         certGen.setNotAfter(new Date(System.currentTimeMillis() + 50000));  
  36.         certGen.setSubjectDN(new X500Principal(subject));  
  37.         certGen.setPublicKey(keyPair.getPublic());  
  38.         certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");  
  39.         X509Certificate cert = certGen.generateX509Certificate(keyPair.getPrivate());  
  40.         System.out.println(cert.toString());  
  41.         //System.out.println(keyPair.getPrivate());  
  42.         //store.setCertificateEntry(alias, cert);  
  43.         store.setKeyEntry("atlas", keyPair.getPrivate(),     
  44.                 "atlas".toCharArray(), new Certificate[] { cert });  
  45.         FileOutputStream fout =new FileOutputStream(certPath);  
  46.         store.store(fout, "atlas".toCharArray());         
  47.         fout.close();    
  48.     }  
  49.     private KeyStore getKeyStore() throws Exception {  
  50.         KeyStore store = KeyStore.getInstance("PKCS12");  
  51.         store.load(null, null);  
  52.         return store;  
  53.     }  
  54. }</span>  

效果圖

下面是生成的證書,以及導出為 pfx 格式的證書。

[plain]  view plain  copy  

Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語
Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">Version: 3  
  2.      SerialNumber: 1420002634985  
  3.          IssuerDN: CN=SICCA,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CN  
  4.        Start Date: Wed Dec 31 13:09:45 CST 2014  
  5.        Final Date: Wed Dec 31 13:11:25 CST 2014  
  6.         SubjectDN: CN=SICCA,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CN  
  7.        Public Key: RSA Public Key  
  8.         modulus: bafbed3edf15d483b8392c7f71af4b4921af7e251ab6a34c316686dafc1d658babcd549bc0dd1324448bfcf6e604f1860d3661ad19e172e37703540c1967a4cce969eb6b9890de67a9c830b873a88f51200a4262ae2b5ff54b1dc4c377a26ab3aa7af6dc7525ffc88fd839b0feaa3d761cba036bfdb93c98f9d41e975f5ed2339075b7abaa9bb262d60ce93d424568c9a3f417a4d7da20092e144fd1f62ac9e1f3d40a3179b84f19763bbb49a945e896c4f5e3d5f30bf8b456b42279d381a1568b0eb7a653e932eda9e16218318e51985e5a53685600a15e6e256092692209909641a0eae99054ea56f53e0a3d6eef0cb2ee261363e056f0a26725b4043189c9  
  9. public exponent: 10001  
  10. Signature Algorithm: SHA256WITHRSA  
  11.         Signature: 3302cf3493d1b8beb1a1400081ff4b5d2a995cdc  
  12.                    fff2f26401d7e8cb90e042edfabcb29e2fe5d70e  
  13.                    a2ad288475e43d275787e2481c4da60302e2ebc7  
  14.                    f897bbd0f6019c6b557678d84044607b9b9d8bd5  
  15.                    f22e1dc75deae1bf17a393b75c8bf5bafda05b86  
  16.                    ec9fa180af896d994c9765d02d3bd4426ce5036c  
  17.                    6bd90b5c2a1ca5789a6af1599a7bbade68f85dc3  
  18.                    e99bdf3f6893d8c22e0d72995a323c54b9f25b81  
  19.                    ae6dfc6f9363b7b7b428fb490dec6b734ede7dbe  
  20.                    cc7720e7c6429e4427beb989dcf00b4ef74fb01f  
  21.                    945120555a4b6f3f7d709aaa41f9a689f8719b6d  
  22.                    d617f2d96b9b27f7ae346883b6d5b1d33d3c7302  
  23.                    b6b83b89d57324a455517443296e135a</span>  
Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語
Java 生成數字證書系列(四)生成數字證書(續) 序 正文效果圖 結束語

結束語

如果隻看證書檔案的話,是沒有什麼差別的,隻不過嘛,在 windows 下這兩種證書的打開方式是不一樣的,大家可以自己去體會一下。

值得指出的一點是,使用密鑰庫的方式存儲證書,是一個很不錯的方案,當然,如果涉及到安全的問題,可以對密鑰庫進行加密,在寫入證書的時候,設定一種比較安全的加密方式,生成的證書就會有通路限制,需要提供通路密碼。沒有密碼的人是通路不了的。當然,我提供的這個例子中是沒有經過加密存儲的。有這方面需求的童鞋,可以看一下 Java api 中的相關介紹。

最後,提前祝大家新年快樂,By the way,現在已經是 2014 年的最後一天了。