<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    waysun一路陽光

    不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實實做事,認認真真做人。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
    一:需要包含的包
        import java.security.*;
        import java.io.*;
        import java.util.*;
        import java.security.*;
        import java.security.cert.*;
        import sun.security.x509.*
        import java.security.cert.Certificate;
        import java.security.cert.CertificateFactory;
    二:從文件中讀取證書
        用keytool將.keystore中的證書寫入文件中,然后從該文件中讀取證書信息
        CertificateFactory cf=CertificateFactory.getInstance("X.509");
        FileInputStream in=new FileInputStream("out.csr");
        Certificate c=cf.generateCertificate(in);
        String s=c.toString();
    三:從密鑰庫中直接讀取證書
        String pass="123456";
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,pass.toCharArray());
        java.security.cert.Certificate c=ks.getCertificate(alias);//alias為條目的別名
    四:JAVA程序中顯示證書指定信息
        System.out.println("輸出證書信息:\n"+c.toString());
        System.out.println("版本號:"+t.getVersion());
        System.out.println("序列號:"+t.getSerialNumber().toString(16));
        System.out.println("主體名:"+t.getSubjectDN());
        System.out.println("簽發者:"+t.getIssuerDN());
        System.out.println("有效期:"+t.getNotBefore());
        System.out.println("簽名算法:"+t.getSigAlgName());
        byte [] sig=t.getSignature();//簽名值 
        PublicKey pk=t.getPublicKey();
        byte [] pkenc=pk.getEncoded();  
        System.out.println("公鑰");
        for(int i=0;i<pkenc.length;i++)System.out.print(pkenc[i]+",");
    五:JAVA程序列出密鑰庫所有條目
        String pass="123456";
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,pass.toCharArray());
        Enumeration e=ks.aliases();
        while(e.hasMoreElements())
        java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());
    六:JAVA程序修改密鑰庫口令
        String oldpass="123456";
        String newpass="654321";
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,oldpass.toCharArray());
        in.close();
        FileOutputStream output=new FileOutputStream(".keystore");
        ks.store(output,newpass.toCharArray());
        output.close();
    七:JAVA程序修改密鑰庫條目的口令及添加條目
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,storepass.toCharArray());
        Certificate [] cchain=ks.getCertificate(alias);獲取別名對應條目的證書鏈
        PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());獲取別名對應條目的私鑰
        ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密鑰庫中添加條目
        第一個參數指定所添加條目的別名,假如使用已存在別名將覆蓋已存在條目,使用新別名將增加一個新條目,第二個參數為條目的私鑰,第三個為設置的新口令,第四個為該私鑰的公鑰的證書鏈
        FileOutputStream output=new FileOutputStream("another");
        ks.store(output,storepass.toCharArray())將keystore對象內容寫入新文件
    八:JAVA程序檢驗別名和刪除條目
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,storepass.toCharArray());
        ks.containsAlias("sage");檢驗條目是否在密鑰庫中,存在返回true
        ks.deleteEntry("sage");刪除別名對應的條目
        FileOutputStream output=new FileOutputStream(".keystore");
        ks.store(output,storepass.toCharArray())將keystore對象內容寫入文件,條目刪除成功
    九:JAVA程序簽發數字證書
        (1)從密鑰庫中讀取CA的證書
        FileInputStream in=new FileInputStream(".keystore");
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,storepass.toCharArray());
        java.security.cert.Certificate c1=ks.getCertificate("caroot");
        (2)從密鑰庫中讀取CA的私鑰
        PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());
        (3)從CA的證書中提取簽發者的信息
        byte[] encod1=c1.getEncoded();    提取CA證書的編碼
        X509CertImpl cimp1=new X509CertImpl(encod1);  用該編碼創建X509CertImpl類型對象
        X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);  獲取X509CertInfo對象
        X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); 獲取X509Name類型的簽發者信息
        (4)獲取待簽發的證書
        CertificateFactory cf=CertificateFactory.getInstance("X.509");
        FileInputStream in2=new FileInputStream("user.csr");
        java.security.cert.Certificate c2=cf.generateCertificate(in);
        (5)從待簽發的證書中提取證書信息
        byte [] encod2=c2.getEncoded();
        X509CertImpl cimp2=new X509CertImpl(encod2);  用該編碼創建X509CertImpl類型對象
        X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);  獲取X509CertInfo對象
        (6)設置新證書有效期
        Date begindate=new Date(); 獲取當前時間
        Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); 有效期為3000天
        CertificateValidity cv=new CertificateValidity(begindate,enddate); 創建對象
        cinfo2.set(X509CertInfo.VALIDITY,cv);  設置有效期
        (7)設置新證書序列號
        int sn=(int)(begindate.getTime()/1000);    以當前時間為序列號
        CertificateSerialNumber csn=new CertificateSerialNumber(sn);
        cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
        (8)設置新證書簽發者
        cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);應用第三步的結果
        (9)設置新證書簽名算法信息
        AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
        cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);
        (10)創建證書并使用CA的私鑰對其簽名
        X509CertImpl newcert=new X509CertImpl(cinfo2);
        newcert.sign(caprk,"MD5WithRSA"); 使用CA私鑰對其簽名
        (11)將新證書寫入密鑰庫
        ks.setCertificateEntry("lf_signed",newcert);
        FileOutputStream out=new FileOutputStream("newstore");
        ks.store(out,"newpass".toCharArray());  這里是寫入了新的密鑰庫,也可以使用第七條來增加條目
    十:數字證書的檢驗
        (1)驗證證書的有效期
     (a)獲取X509Certificate類型對象
     CertificateFactory cf=CertificateFactory.getInstance("X.509");
        FileInputStream in1=new FileInputStream("aa.crt");
      java.security.cert.Certificate  c1=cf.generateCertificate(in1);
     X509Certificate t=(X509Certificate)c1;
      in2.close();
            (b)獲取日期
     Date TimeNow=new Date();
     (c)檢驗有效性
     try{
        t.checkValidity(TimeNow);
               System.out.println("OK");
     }catch(CertificateExpiredException e){  //過期
        System.out.println("Expired");
        System.out.println(e.getMessage());
     }catch((CertificateNotYetValidException e){ //尚未生效
        System.out.println("Too early");
        System.out.println(e.getMessage());}
         (2)驗證證書簽名的有效性
     (a)獲取CA證書
             CertificateFactory cf=CertificateFactory.getInstance("X.509");
         FileInputStream in2=new FileInputStream("caroot.crt");
       java.security.cert.Certificate  cac=cf.generateCertificate(in2);
      in2.close();
     (c)獲取CA的公鑰
      PublicKey pbk=cac.getPublicKey();
     (b)獲取待檢驗的證書(上步已經獲取了,就是C1)
     (c)檢驗證書
             boolean pass=false;
             try{
          c1.verify(pbk);
                 pass=true;
             }catch(Exception e){
                 pass=false;
                 System.out.println(e);
      }
    本文來自CSDN博客,轉載請標明出處:file:///E:/20.html/JAVA對數字證書的常用操作%20-%20在JAVA的世界中“乘風破浪”%20-%20CSDN博客.mht
    posted on 2011-06-20 15:01 weesun一米陽光 閱讀(411) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲日韩图片专区第1页| 少妇高潮太爽了在线观看免费| h片在线播放免费高清| 大片免费观看92在线视频线视频| 亚洲AV成人无码久久WWW| 亚洲欧美自偷自拍另类视| 亚洲乱妇熟女爽到高潮的片| 狠狠色伊人亚洲综合网站色| 亚洲中文字幕久久无码| 亚洲heyzo专区无码综合| 亚洲国产成人精品无码区花野真一| 国产精品久久久久久亚洲影视| 国产精品亚洲AV三区| 一级一级毛片免费播放| 成人性做爰aaa片免费看| 一级毛片在线免费观看| 中文字幕免费在线观看| 福利免费观看午夜体检区| 日韩精品免费电影| 亚洲福利精品一区二区三区| 国产AⅤ无码专区亚洲AV| 亚洲AV无码专区在线播放中文| 亚洲视频网站在线观看| 亚洲一本到无码av中文字幕 | 日本高清免费不卡视频| 国产高清免费在线| 亚洲色一色噜一噜噜噜| 亚洲VA中文字幕无码毛片| 亚洲视频一区网站| 亚洲av无码有乱码在线观看| 一级女性全黄生活片免费看| 在线播放免费人成毛片乱码| 国产香蕉免费精品视频| 免费无码又爽又刺激毛片| 最新精品亚洲成a人在线观看| 亚洲第一中文字幕| 亚洲日韩AV一区二区三区中文| 一个人看的在线免费视频| 2021精品国产品免费观看| 大学生一级特黄的免费大片视频| 亚洲人成影院在线无码观看|