java读取数字证书信息.docx
《java读取数字证书信息.docx》由会员分享,可在线阅读,更多相关《java读取数字证书信息.docx(11页珍藏版)》请在冰豆网上搜索。
java读取数字证书信息
竭诚为您提供优质文档/双击可除
java读取数字证书信息
篇一:
JAVA对数字证书的常用操作
阅读提示:
本文介绍JAVA对数字证书的常用操作
一需要包含的包
importjava.security.*;
importjava.io.*;
importjava.util.*;
importjava.security.*;
importjava.security.cert.*;
importsun.security.x509.*
importjava.security.cert.certificate;
importjava.security.cert.certificateFactory;
二从文件中读取证书
用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息certificateFactorycf=certificateFactory.getInstance("x.509");
FileInputstreamin=newFileInputstream("out.csr");
certificatec=cf.generatecertificate(in);strings=c.tostring();
三从密钥库中直接读取证书
stringpass="123456";
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,pass.tocharArray());
java.security.cert.certificatec=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();//签名值
publicKeypk=t.getpublicKey();
byte[]pkenc=pk.getencoded();
system.out.println("公钥");
for(inti=0;i 五JAVA程序列出密钥库所有条目
stringpass="123456";
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,pass.tocharArray());
enumeratione=ks.aliases();
while(e.hasmoreelements())
java.security.cert.certificatec=ks.getcertificate((string)e.nextelement());
六JAVA程序修改密钥库口令
stringoldpass="123456";
stringnewpass="654321";
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,oldpass.tocharArray());
in.close();
Fileoutputstreamoutput=newFileoutputstream(".keystore");
ks.store(output,newpass.tocharArray());
output.close();
七JAVA程序修改密钥库条目的口令及添加条目
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,storepass.tocharArray());
certificate[]cchain=ks.getcertificate(alias);获取别名对应条目的证书链
privateKeypk=(privateKey)ks.getKey(alias,oldkeypass.tocharArray());获取别名对应条目的私钥
ks.setKeyentry(alias,pk,newkeypass.tocharArray(),cchain);向密钥库中添加条目
第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链
Fileoutputstreamoutput=newFileoutputstream("another");
ks.store(output,storepass.tocharArray())将keystore对象内容写入新文件
八JAVA程序检验别名和删除条目
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,storepass.tocharArray());
ks.containsAlias("sage");检验条目是否在密钥库中,存在返回true
ks.deleteentry("sage");删除别名对应的条目
Fileoutputstreamoutput=newFileoutputstream(".keystore");
ks.store(output,storepass.tocharArray())将keystore对象内容写入文件,条目删除成功
九JAVA程序签发数字证书
(1)从密钥库中读取cA的证书
FileInputstreamin=newFileInputstream(".keystore");
Keystoreks=Keystore.getInstance("JKs");
ks.load(in,storepass.tocharArray());
java.security.cert.certificatec1=ks.getcertificate("caroot");
(2)从密钥库中读取cA的私钥
privateKeycaprk=(privateKey)ks.getKey(alias,cakeypass.tocharArray());
(3)从cA的证书中提取签发者的信息
byte[]encod1=c1.getencoded();提取cA证书的编码
x509certImplcimp1=newx509certImpl(encod1);用该编码创建x509certImpl类型对象
x509certInfo
cinfo1=(x509certInfo)cimp1.get(x509certImpl.nAme+"."+x509certImpl.InFo);获取x509certInfo对象
x500name
issuer=(x500name)cinfo1.get(x509certInfo.subJecT+"."+certificateIssuername.Dn_nAme);获取x509name类型的签发者信息
(4)获取待签发的证书
certificateFactorycf=certificateFactory.getInstance("x.509");
FileInputstreamin2=newFileInputstream("user.csr");
java.security.cert.certificatec2=cf.generatecertificate(in);
(5)从待签发的证书中提取证书信息
byte[]encod2=c2.getencoded();
x509certImplcimp2=newx509certImpl(encod2);用该编码创建x509certImpl类型对象
x509certInfo
cinfo2=(x509certInfo)cimp2.get(x509certImpl.nAme+"."+x509certImpl.InFo);获取x509certInfo对象
(6)设置新证书有效期
Datebegindate=newDate();获取当前时间
Dateenddate=newDate(begindate.getTime()+3000*24*60*60*1000L);有效期为3000天
certificateValiditycv=newcertificateValidity(begindate,enddate);创建对象cinfo2.set(x509certInfo.VALIDITY,cv);设置有效期
(7)设置新证书序列号
intsn=(int)(begindate.getTime()/1000);以当前时间为序列号
certificateserialnumbercsn=newcertificateserialnumber(sn);
cinfo2.set(x509certInfo.seRIAL_numbeR,csn);
(8)设置新证书签发者
cinfo2.set(x509certInfo.IssueR+"."+certificateIssuername.Dn_nAme,issuer);应用第三步的结果
(9)设置新证书签名算法信息
AlgorithmIdalgorithm=newAlgorithmId(AlgorithmId.md5withRsAencryption_oid);
cinfo2.set(certificateAlgorithmId.nAme+"."+certificateAlgorithmId.ALgoRIThm,algorithm);
(10)创建证书并使用cA的私钥对其签名
x509certImplnewcert=newx509certImpl(cinfo2);
newcert.sign(caprk,"mD5withRsA");使用cA私钥对其签名
(11)将新证书写入密钥库
ks.setcertificateentry("lf_signed",newcert);
Fileoutputstreamout=newFileoutputstream("newstore");
ks.store(out,"newpass".tocharArray());这里是写入了新的密钥库,也可以使用
第七条来增加条目
十数字证书的检验
(1)验证证书的有效期
(a)获取x509certificate类型对象
certificateFactorycf=certificateFactory.getInstance("x.509");
FileInputstreamin1=newFileInputstream("aa.crt");
java.security.cert.certificatec1=cf.generatecertificate(in1);
x509certificatet=(x509certificate)c1;
in2.close();
(b)获取日期
DateTimenow=newDate();
(c)检验有效性
try{
t.checkValidity(Timenow);
system.out.println("oK");
}catch(certificateexpiredexceptione){//过期
system.out.println("expired");
system.out.println(e.getmessage());
}catch((certificatenotYetValidexceptione){//尚未生效
system.out.println("Tooearly");
system.out.println(e.getmessage());}
(2)验证证书签名的有效性
(a)获取cA证书
certificateFactorycf=certificateFactory.getInstance("x.509");
FileInputstreamin2=newFileInputstream("caroot.crt");
java.security.cert.certificatecac=cf.generatecertificate(in2);
in2.close();
(c)获取cA的公钥
publicKeypbk=cac.getpublicKey();
(b)获取待检验的证书(上步已经获取了,就是c1)(c)检验证书
booleanpass=false;
try{
c1.verify(pbk);
pass=true;
}catch(exceptione){
pass=false;
system.out.println(e);
}
篇二:
Java使用数字证书加密文件(含代码)
JAVA使用数字证书加密解密文件
总结
目录
1.编写目的........................................................................................................................................3
2.JAVA生产数字证书.....................................................................................................................4
2.1.1keystore(JKs)的生成.............................................................................................4
2.1.2导出公钥.................................................................................................................5
3.使用JKs私钥加密文件...............................................................................................................5
4.转换为pFx格式私钥..................................................................................................................6
5.使用pFx加密文件......................................................................................................................7
6源代码...........................................................................................................................................8
6.1用到的JAR包...................................................................................................................8
6.2示例代码............................................................................................................................8
6.2.1Test.java...................................................................................................................8
6.2.2Rsautil.java............................................................................................................10
6.2.3base64.java............................................................................................................19
7.结束语..........................................................................................................................................26
1.编写目的
学习RsA算法,读取数字证书中的私钥对文件进行加密,使用数字证书的公钥解密,这种方式就是RsA算法.
自己对RsA算法的理解:
?
私钥加密公钥解密:
如果用私钥对文件加密,发给别人,别人用我公布的公钥进行解
密,实现这个文件就是我本人制作的,不是别人做的.
?
公钥加密私钥解密:
如果别人用我的公钥加密文件,那么只能我一个人看,只有使用
我的私钥进行解密,私钥一定是不能告诉其他人的.
本文讲解如何用JKs私钥对文件进行加密,用对于cRT公钥进行解密,将JKs私钥转换为pFx格式私钥,并用pFx私钥对文件进行加密解密
Jks:
是JAVA的keytools证书工具支持的证书私钥格式
pfx:
是微软支持的私钥格式
?
2.JAVA生产数字证书
为了实现数字证书加密文件,我们首先要制作几个数字证书,如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.
2.1keytool创建数字证书
Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:
?
密钥实体(Keyentity):
密钥(secretkey)又或者是私钥
?
配对公钥(采用非对称加密):
可信任的证书实体(trustedcertificateentries),只
包含公钥
2.1.1keystore(JKs)的生成
?
分阶段生成:
命令格式:
keytool-genkey-aliasyushan(别名)-keypassyushan(别名密码)-keyalgRsA(算法)-keysize1024(密钥长度)-validity365(有效期,天单位)-keystoree:
\yushan.keystore(指定生成证书的位置和证书名称)-storepass123456(获取keystore信息的密码);
示例:
?
1)cmd下进入java/bin
?
2)输入命令keytool-genkey-aliasmyalias-keypass123456-keyalgRsA-keysize1024
-validity365-keystored:
\myalias.keystore-storepass123456
?
一次性生成:
keytool-genkey-aliasyushan-keypassyushan-keyalgRsA-keysize1024-validity365-keystoree:
\yushan.keystore-storepass123456-dname"cn=(名字与姓氏),ou=(组织单位名称),o=(组织名称),L=(城市或区域名称),sT=(州或省份名称),c=(
单位的两字母国家代
码)";(中英文即可)
无例图
2.1.2导出公钥
命令:
keytool-export-aliasmyalias-keystored:
\myalias.keystore-filed:
\myalias.crt-storepass123456
创建结果:
3.使用JKs私钥加密文件
//工具类
RsAutilrsa=newRsAutil();
//从jks私钥中获取私钥加密串
privateKeypriKeyFromKs=rsa.getpriKeyFromKs("d:
\\myalias.keystore","123456","myalias","123456");
//从jks私钥中获取公钥解密串
publicKeypubKeyFromKs=rsa.getpubKeyFromKs("d:
\\myalias.keystore",
"123456","myalias");
//从crt公钥中获取公钥解密串
publicKeypubKeyFromcrt=rsa.getpubKeyFromcRT("d:
\\myalias.crt");
//用私钥串加密
rsa.encryptwithprv("d:
\\file.xml",priKeyFromKs,"d:
\\file_encwithKspri.xml",