网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java对于数字证书的常用操作方法     
  文章作者:未知  文章来源:水木森林  
  查看:57次  录入:管理员--2007-11-16  
  一:需要包含的包

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);

}
 
 
上一篇: 利用java applet编程实现动画特技(1)    下一篇: 如何使用java编写多线程程序(1)
  相关文档
为何不让soa变得简单? 11-17
think in java stream 经典 11-17
mvc减少编程复杂性 11-16
使用struts,ibaits和jstl开发简便通用的文件上传系统(5) 11-17
sun认证管理新办法(2003考生版) 11-17
emf-sdo-xsd-sdk-2.1.0 11-17
j2ee程序的backbase ajax前端(组图) 11-17
如何开始学习jsp(转) 11-17
用消息交换增强ebxml的安全性 11-17
用java程序获取绝对路径 11-17
weblogic 9新特性:web services(组图) 11-17
多线程问题导致的jdbmonitor的bug分析 02-29
常见的application server 11-17
课程介绍(10)sl-315 java server pages技术 11-16
java中的对象引用问题的再次理解 11-17
在网页里做类似window右键的弹出式菜单 11-16
java技巧:在对标准流进行重定向 11-17
关于ejb返回值的解决方案 11-16
java咖啡馆(2)——第一杯咖啡 11-16
java、java applet与 javascript间的通信 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息