JAVA对数字证书的常用操作

一需要包含的包

Java代码 复制代码
  1.  import java.security.*;       
  2.       
  3. import java.io.*;       
  4.       
  5. import java.util.*;       
  6.       
  7. import java.security.*;       
  8.       
  9. import java.security.cert.*;       
  10.       
  11. import sun.security.x509.*       
  12.       
  13. import java.security.cert.Certificate;       
  14.       
  15. import java.security.cert.CertificateFactory;      
 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中的证书写入文件中,然后从该文件中读取证书信息

Java代码 复制代码
  1. CertificateFactory cf=CertificateFactory.getInstance("X.509");       
  2.       
  3. FileInputStream in=new FileInputStream("out.csr");       
  4.       
  5. Certificate c=cf.generateCertificate(in); String s=c.toString();      
CertificateFactory cf=CertificateFactory.getInstance("X.509");    
   
FileInputStream in=new FileInputStream("out.csr");    
   
Certificate c=cf.generateCertificate(in); String s=c.toString();    


三 从密钥库中直接读取证书

Java代码 复制代码
  1. String pass="123456";       
  2.       
  3. FileInputStream in=new FileInputStream(".keystore");       
  4.       
  5. KeyStore ks=KeyStore.getInstance("JKS");       
  6.       
  7. ks.load(in,pass.toCharArray());       
  8.       
  9. java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名   
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程序中显示证书指定信息

Java代码 复制代码
  1. System.out.println("输出证书信息:\n"+c.toString());       
  2.       
  3. System.out.println("版本号:"+t.getVersion());       
  4.       
  5. System.out.println("序列号:"+t.getSerialNumber().toString(16));       
  6.       
  7. System.out.println("主体名:"+t.getSubjectDN());       
  8.       
  9. System.out.println("签发者:"+t.getIssuerDN());       
  10.       
  11. System.out.println("有效期:"+t.getNotBefore());       
  12.       
  13. System.out.println("签名算法:"+t.getSigAlgName());       
  14.       
  15. byte [] sig=t.getSignature();//签名值       
  16.       
  17. PublicKey pk=t.getPublicKey();       
  18.       
  19. byte [] pkenc=pk.getEncoded();       
  20.       
  21. System.out.println("公钥");       
  22.       
  23. for(int i=0;i<pkenc.length;i++)System.out.print(pkenc+",");       
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+",");     


五 JAVA程序列出密钥库所有条目

Java代码 复制代码
  1. String pass="123456";       
  2.       
  3. FileInputStream in=new FileInputStream(".keystore");       
  4.       
  5. KeyStore ks=KeyStore.getInstance("JKS");       
  6.       
  7. ks.load(in,pass.toCharArray());       
  8.       
  9. Enumeration e=ks.aliases();       
  10.       
  11. while(e.hasMoreElements())       
  12.       
  13. java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());     
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程序修改密钥库口令

Java代码 复制代码
  1. String oldpass="123456";       
  2.       
  3. String newpass="654321";       
  4.       
  5. FileInputStream in=new FileInputStream(".keystore");       
  6.       
  7. KeyStore ks=KeyStore.getInstance("JKS");       
  8.       
  9. ks.load(in,oldpass.toCharArray());       
  10.       
  11. in.close();       
  12.       
  13. FileOutputStream output=new FileOutputStream(".keystore");       
  14.       
  15. ks.store(output,newpass.toCharArray());       
  16.       
  17. output.close();      
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程序修改密钥库条目的口令及添加条目

Java代码 复制代码
  1. FileInputStream in=new FileInputStream(".keystore");       
  2.       
  3. KeyStore ks=KeyStore.getInstance("JKS");       
  4.       
  5. ks.load(in,storepass.toCharArray());       
  6.       
  7. Certificate [] cchain=ks.getCertificate(alias);//获取别名对应条目的证书链       
  8.       
  9. PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());//获取别名对应条目的私钥       
  10.       
  11. ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);//向密钥库中添加条目      
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);//向密钥库中添加条目    


第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链

Java代码 复制代码
  1. FileOutputStream output=new FileOutputStream("another");       
  2.       
  3. ks.store(output,storepass.toCharArray())//将keystore对象内容写入新文件    
FileOutputStream output=new FileOutputStream("another");    
   
ks.store(output,storepass.toCharArray())//将keystore对象内容写入新文件  


八 JAVA程序检验别名和删除条目

Java代码 复制代码
  1. FileInputStream in=new FileInputStream(".keystore");       
  2.       
  3. KeyStore ks=KeyStore.getInstance("JKS");       
  4.       
  5. ks.load(in,storepass.toCharArray());       
  6.       
  7. ks.containsAlias("sage");//检验条目是否在密钥库中,存在返回true       
  8.       
  9. ks.deleteEntry("sage");//删除别名对应的条目       
  10.       
  11. FileOutputStream output=new FileOutputStream(".keystore");       
  12.       
  13. ks.store(output,storepass.toCharArray())//将keystore对象内容写入文件,条目删除成功     
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的证书

Java代码 复制代码
  1. FileInputStream in=new FileInputStream(".keystore");       
  2.       
  3. KeyStore ks=KeyStore.getInstance("JKS");       
  4.       
  5. ks.load(in,storepass.toCharArray());       
  6.       
  7. java.security.cert.Certificate c1=ks.getCertificate("caroot");      
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的私钥

Java代码 复制代码
  1. PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());     
PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());   


(3)从CA的证书中提取签发者的信息

Java代码 复制代码
  1. byte[] encod1=c1.getEncoded(); //提取CA证书的编码       
  2.       
  3. X509CertImpl cimp1=new X509CertImpl(encod1); //用该编码创建X509CertImpl类型对象       
  4.       
  5. X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); //获取X509CertInfo对象       
  6.       
  7. X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); //获取X509Name类型的签发者信息  
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)获取待签发的证书

Java代码 复制代码
  1. CertificateFactory cf=CertificateFactory.getInstance("X.509");       
  2.       
  3. FileInputStream in2=new FileInputStream("user.csr");       
  4.       
  5. java.security.cert.Certificate c2=cf.generateCertificate(in);      
CertificateFactory cf=CertificateFactory.getInstance("X.509");    
   
FileInputStream in2=new FileInputStream("user.csr");    
   
java.security.cert.Certificate c2=cf.generateCertificate(in);    


(5)从待签发的证书中提取证书信息

Java代码 复制代码
  1. byte [] encod2=c2.getEncoded();       
  2.       
  3. X509CertImpl cimp2=new X509CertImpl(encod2); //用该编码创建X509CertImpl类型对象       
  4.       
  5. X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); //获取X509CertInfo对象      
byte [] encod2=c2.getEncoded();    
   
X509CertImpl cimp2=new X509CertImpl(encod2); //用该编码创建X509CertImpl类型对象    
   
X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); //获取X509CertInfo对象    


(6)设置新证书有效期

Java代码 复制代码
  1. Date begindate=new Date(); //获取当前时间       
  2.       
  3. Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); //有效期为3000天       
  4.       
  5. CertificateValidity cv=new CertificateValidity(begindate,enddate); //创建对象       
  6.       
  7. cinfo2.set(X509CertInfo.VALIDITY,cv); //设置有效期    
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)设置新证书序列号

Java代码 复制代码
  1. int sn=(int)(begindate.getTime()/1000); //以当前时间为序列号       
  2.       
  3. CertificateSerialNumber csn=new CertificateSerialNumber(sn);       
  4.       
  5. cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);      
int sn=(int)(begindate.getTime()/1000); //以当前时间为序列号    
   
CertificateSerialNumber csn=new CertificateSerialNumber(sn);    
   
cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);    


(8)设置新证书签发者

Java代码 复制代码
  1. cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);//应用第三步的结果     
cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);//应用第三步的结果   


(9)设置新证书签名算法信息

Java代码 复制代码
  1. AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);       
  2.       
  3. cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);    
AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);    
   
cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);  


(10)创建证书并使用CA的私钥对其签名

Java代码 复制代码
  1. X509CertImpl newcert=new X509CertImpl(cinfo2);       
  2.       
  3. newcert.sign(caprk,"MD5WithRSA"); //使用CA私钥对其签名    
X509CertImpl newcert=new X509CertImpl(cinfo2);    
   
newcert.sign(caprk,"MD5WithRSA"); //使用CA私钥对其签名  


(11)将新证书写入密钥库

Java代码 复制代码
  1. ks.setCertificateEntry("lf_signed",newcert);       
  2.       
  3. FileOutputStream out=new FileOutputStream("newstore");       
  4.       
  5. ks.store(out,"newpass".toCharArray()); //这里是写入了新的密钥库,也可以使用第七条来增加条目     
ks.setCertificateEntry("lf_signed",newcert);    
   
FileOutputStream out=new FileOutputStream("newstore");    
   
ks.store(out,"newpass".toCharArray()); //这里是写入了新的密钥库,也可以使用第七条来增加条目   


十 数字证书的检验

(1)验证证书的有效期

(a)获取X509Certificate类型对象

Java代码 复制代码
  1. CertificateFactory cf=CertificateFactory.getInstance("X.509");       
  2.       
  3. FileInputStream in1=new FileInputStream("aa.crt");       
  4.       
  5. java.security.cert.Certificate c1=cf.generateCertificate(in1);       
  6.       
  7. X509Certificate t=(X509Certificate)c1;       
  8.       
  9. in2.close();      
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)获取日期

Java代码 复制代码
  1. Date TimeNow=new Date();     
Date TimeNow=new Date();   


(c)检验有效性

Java代码 复制代码
  1. try{       
  2.       
  3. t.checkValidity(TimeNow);       
  4.       
  5. System.out.println("OK");       
  6.       
  7. }catch(CertificateExpiredException e){ //过期       
  8.       
  9. System.out.println("Expired");       
  10.       
  11. System.out.println(e.getMessage());       
  12.       
  13. }catch((CertificateNotYetValidException e){ //尚未生效       
  14.       
  15. System.out.println("Too early");       
  16.       
  17. System.out.println(e.getMessage());}      
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证书

Java代码 复制代码
  1. CertificateFactory cf=CertificateFactory.getInstance("X.509");       
  2.       
  3. FileInputStream in2=new FileInputStream("caroot.crt");       
  4.       
  5. java.security.cert.Certificate cac=cf.generateCertificate(in2);       
  6.       
  7. in2.close();      
CertificateFactory cf=CertificateFactory.getInstance("X.509");    
   
FileInputStream in2=new FileInputStream("caroot.crt");    
   
java.security.cert.Certificate cac=cf.generateCertificate(in2);    
   
in2.close();    


(c)获取CA的公钥

Java代码 复制代码
  1. PublicKey pbk=cac.getPublicKey();     
PublicKey pbk=cac.getPublicKey();   


(b)获取待检验的证书(上步已经获取了,就是C1)
(c)检验证书

Java代码 复制代码
  1. boolean pass=false;       
  2.       
  3. try{       
  4.       
  5. c1.verify(pbk);       
  6.       
  7. pass=true;       
  8.       
  9. }catch(Exception e){       
  10.       
  11. pass=false;       
  12.       
  13. System.out.println(e);       
  14.       
  15. }    
boolean pass=false;    
   
try{    
   
c1.verify(pbk);    
   
pass=true;    
   
}catch(Exception e){    
   
pass=false;    
   
System.out.println(e);    
   
}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值