Java對檔案進行數位簽章

來源:互聯網
上載者:User
一:需要包含的包
    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);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.