热列祝贺:中国共产党第十七次全国代表大会胜利闭幕   颜色主题:   网页游戏 软件下载 软件文章 常用网址 自助友情
 首页程序设计数据库操作系统办公系列WEB开发项目专题网络安全图形图像站点地图友情链接
 您的位置: >首页 >程序设计 >Java >未分类 >JAVA对数字证书的常用操作
  文章搜索
按名称 按简介
  本类推荐
· HTML转PDF (不支持中文)
· 缩小图片的高和宽
· Java异常处理--尽量不要从tr...
· Java的数组(Array)、Vector...
· 一个简单的用JAVA实现的屏幕抓...
· JAVA国际化DEMO
· java 面试中的一道编写一个截...
· Vector在Java编程中的应用
· 浅析Java中Data类的应用
· 深入研究Servlet线程安全性问题
  本类排行
· java解rar压缩
· 删除文件夹下的所有文件
· java解zip压缩 和 把目录压缩...
· 在eclipse + MyEclipse下配置...
· HTML转PDF (不支持中文)
· java中文问题(原创)
· JAVA中通过JDBC访问MS SQLServ...
· weblogic——远程/近程调用EJB...
· 避免重启你的应用程序 一
· 把数据写入Excel文件中
· java锁住一个文件(独占方式访...
· java实现URL带参数请求(get/po...
· Hibernate获得成功的十大理由
· EJB3 and Hibernate3 Annotati...
· Java中的“数据集”
· EJB3 and Hibernate Annotatio...
· 一篇关于session的好文!
· JDBC基础知识(1)
· 避免重启你的应用程序 二
· java实现URL带参数请求(get/po...
· Struts控制器组件
· MyEclipse开发Struts框架的Hel...
· 小谈JDBC中的连接与连接池
· 反醒一下,兼java.lang的一点点...
· 利用JSP获取网页源文件并抓取...
· Java参数传递的一些心得
· Java源码分析:深入探讨Iterat...
· So what are inner classes go...
· SQL Server2000+JDBC常见问题...
· java.net.InetSocketAddress翻译
· JAVA对数字证书的常用操作
· 我翻译的J2EE平台安全(原著是...
· 在 Java 应用程序中访问USB设备
· 得到一张图片的宽度和高度
· 缩小图片的高和宽
· Java的数组(Array)、Vector...
· 深入研究Servlet线程安全性问题
· Java新手上路大全(初学必看)
· JAVA国际化DEMO
· Java异常处理--尽量不要从tr...
· 浅析Java中Data类的应用
· Vector在Java编程中的应用
· Java Applet 入门(目录)
· 一个简单的用JAVA实现的屏幕抓...
· Java学习从入门到精通 3过程篇
· java 面试中的一道编写一个截...
· Java打印程序设计全攻略
· Java学习从入门到精通 2书籍篇
· Eclipse 3.0 简介和插件开发示例
· Java学习从入门到精通 1工具篇
JAVA对数字证书的常用操作

一:需要包含的包
  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
五: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);
}
  相关软件
·DJ Java Decompiler v3.10.10.93
·Jext v5.0.1 for Windows
·Antechinus JavaScript Editor Pro v8.0
·小颖JAVA源代码反编译超级引挚
·Java编程思想(完整版).chm
·Java语言入门
·Java视频教程
·install4j v4.1
·Lucene in Action
·Cavaj Java Decompiler
  相关文章
·反醒一下,兼java.lang的一点点东西
·java锁住一个文件(独占方式访问)
·java实现URL带参数请求(get/post)
·java中文问题(原创)
·JAVA中通过JDBC访问MS SQLServer2000的常见问题
·Java中的“数据集”
·java实现URL带参数请求(get/post)
·Java源码分析:深入探讨Iterator模式
·Java参数传递的一些心得
·java.net.InetSocketAddress翻译
下载帮助 发布软件 自助友情 友情链接 网站导航 广告服务 法律声明 联系我们
六世下载 版权所有 ©2005-2007
本站的数据收集于网络,版权归原作者及出版社所有 如果您觉得侵犯了您的版权请来信告诉我们,我们会尽快删除其内容!
鲁ICP备05050400号