一:需要包含的包
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面试是每位Java开发者职业生涯中的重要环节,它不仅测试你的技术实力,还考察你的问题解决能力和团队合作精神。以下是一些在Java面试中常见的知识点,这些内容可能在"Java面试宝典2010版.doc"中有所涵盖。 1. *...
北京市大数据与数字经济发展情况视频会议纪要
【Java会议纪要】主要涉及了Java在业务处理和系统开发中的应用,特别是与酬金计算、数据过滤和产品管理相关的部分。以下是根据会议内容整理的相关知识点: 1. **数据处理流程**: - 在Java中,对于大量数据的处理...
设计技术交底会议纪要是一项在工程建设项目中至关重要的文档,它记录了设计阶段与施工阶段之间进行的技术交流和共识,确保所有参与方对工程设计的理解一致,避免因理解偏差导致的施工问题和延误。这份会议纪要通常...
国有企业数字化转型加快构建新发展格局视频会议纪要
### 会议纪要模板知识点详解 #### 一、会议纪要概述 会议纪要是记录会议内容、决定事项以及后续行动方案的重要文档。它不仅能够帮助与会者回顾会议要点,还可以作为日后工作推进的依据。良好的会议纪要应包含完整...
工程技术例会会议纪要(2013.3.26).doc
摩托车技术委员会会议纪要.pdf
这篇文档是2006年浙江省消防工程技术专家组研讨会议的纪要,主要涉及了在实际应用消防技术规范过程中遇到的问题以及解决方案。以下是会议中讨论的一些关键知识点: 1. **高层建筑登高面**:在特殊情况下,登高面...
通过会议,各相关单位能够统一思想,精心组织,科学安排,分工负责,确保工程项目的顺利进行。 其次,会议纪要能够记录工程项目的启动情况。该会议纪要能够记录工程项目的启动时间、地点、参加人员、会议内容等信息...
20140911-推进大数据技术快速落地-敏捷大数据 会议纪要doc,本文主要描述了敏捷大数据 推动管理模式的全面提升。
"公司会议纪要.DOC" 公司会议纪要.DOC 是一份用于记录公司会议的文件,它通常包括会议的主题、时间、地点、出席人员、会议记录和整理等信息。 知识点1:会议纪要的重要性 会议纪要是记录公司会议的重要文件,用于...
网络信息安全会议纪要范文全文共4页,当前为第1页。网络信息安全会议纪要范文全文共4页,当前为第1页。网络信息安全会议纪要范文 网络信息安全会议纪要范文全文共4页,当前为第1页。 网络信息安全会议纪要范文全文共...
12. **参考信息(资料、备注)**:提供与会议相关的参考资料或其他重要信息。 ### 三、编写高质量会议纪要的技巧 1. **清晰准确**:确保会议纪要中的信息表述清晰、准确无误。 2. **结构化**:按照一定的逻辑顺序...
- 与会人员签字:会议纪要需要所有参会关键方的签名,以表明他们对纪要内容的认可。 - 监理单位:在工程中起到监督和指导作用,确保工程质量和进度符合合同规定。 - 甲方:通常指的是工程项目的投资方或业主,...
"软件项目会议纪要范本" 软件项目会议纪要是软件项目管理中的一种重要文档,它记录了软件项目会议的讨论内容、决策和行动计划。软件项目会议纪要范本是根据软件项目的特点和需求编写的,旨在帮助项目团队更好地管理...
9. **签字**:会议纪要需要所有关键参与者签名确认,以证明他们已阅读并同意纪要内容,确保责任明确。 10. **日期**:签署纪要的日期,确保所有行动点的时间节点清晰。 通过这份监理会议纪要表,可以系统地跟踪和...
由于提供的文件内容存在OCR扫描识别错误和不完整的情况,...在实际操作中,详细准确地记录会议纪要对整个项目的成功至关重要,因此需要使用专业的文档处理软件确保文档的清晰完整,并采取措施防止技术错误导致的问题。
从提供的文件内容“施工进度专题会议纪要.pdf”中无法直接提取出具体的技术知识点,因为该文件名及提供的部分内容并没有包含足够的信息来确定讨论的具体技术问题。文件标题和描述表明这是一个关于施工进度讨论的会议...
会议纪要作为组织内部沟通和决策的重要文档,其格式和内容的规范性直接影响到会议决策的有效传达和执行。本文将详细解析如何制作专业且实用的会议纪要模板,以及在不同规模会议中如何进行有效记录。 一、会议纪要...