实验指导数字证书.docx
- 文档编号:30443113
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:20
- 大小:344.58KB
实验指导数字证书.docx
《实验指导数字证书.docx》由会员分享,可在线阅读,更多相关《实验指导数字证书.docx(20页珍藏版)》请在冰豆网上搜索。
实验指导数字证书
一.CA数字证书的创建
实例说明:
本实例使用J2SDK提供的keytool工具用RSA算法在指定的密钥库mykeystore中创建公钥/私钥对和证书,并将证书导出到证书文件,设置此证书为CA证书。
运行程序:
1.用RSA算法在指定的密钥库mykeystore中创建公钥/私钥对和证书
在命令行中输入“keytool–genkey–aliasmycacert–keyalgRSA–keysize1024–keystoremykeystore–validity7”。
该操作将使用RSA算法生成1024位的公钥/私钥对及证书,密钥长度为1024位,证书有效期是7天。
证书中包含了新生成的公钥和一个名字为“CN=wangzhihui,OU=gridsecuritycenter,O=dlut,L=dalian,ST=liaoning,C=cn”的主体(人或机构)的对应关系。
其中“CN=wangzhihui,OU=gridsecuritycenter,O=dlut,L=dalian,ST=liaoning,C=cn”是X.500格式的全名,包含了主体的国家,洲,城市,机构,单位和名字。
这样,这个证书将证明相应的公钥是这个人或机构所拥有的。
使用的密钥库是mykeystore文件。
其中keytool的
–genkey参数用于生成公钥和私钥,并以交互的方式获取公钥持有者的信息,同时生成一个能证明此公钥归持有者所有的证书。
–alias参数用于指定新生成的公钥和私钥对及证书在密钥库中对应的别名。
–keyalg参数可以指定密钥的算法,如RSA,DSA。
-keysize参数用于指定密钥的长度,默认为1024,如果使用的是DSA算法,其密钥长度必须在512-1024之间,且必须是64的倍数。
-keystore参数可以指定密钥库的名称。
密钥库其实是存放密钥和证书的文件,密钥库对应的文件如果不存在则自动创建,由于密钥库中包含了私钥,所以是一个需要保密的文件,上述命令行执行时会提示输入keystore的密码,这里因为是第一次使用该密钥库,因此输入的密码“123456”将成为该密钥库默认的密码,以后再使用这个密钥库时必须提供这个口令才可以使用。
-validity参数可以指定所创建的证书有效期是多少天。
以上操作最后还提示“输入〈mycacert〉的主密码”,此处输入的密码是对应于该别名的私钥的密码,密钥库中每个别名对应的私钥可以使用不同的密码加以保护。
2.从密钥库显示条目信息并将证书导出到证书文件
a.在命令行中输入“keytool–list–keystoremykeystore-v”。
keytool的命令行参数-list可以显示密钥库中的证书信息,进一步使用-keystore参数可
以显示指定的密钥库中的证书信息,在命令上加上-v参数可以显示证书的详细信息。
b.使用keytool的-export可以将别名指定的证书导出到文件,文件名通过-file参数指定。
如输入如下命令:
“keytool–export–aliasmycacert–keystoremykeystore-storepass123456–filemycacert.cer–rfc”。
该操作完成后将在当前目录中创建mycacert.cer文件,它包含了公钥和主体的对应关系,内容可以公开。
-rfc参数是使用一种可打印的编码格式来保存证书,如下图所示。
如果不使用此参数,则使用文本编辑器打开mycacert.cer,将会发现它是二进制文件。
在windows中双击mycacert.cer的图表,将出现包含了证书所有者,颁发者和有效期等信息的对话框,这些信息与前面使用keytool显示出的信息一致。
3.安装mycacert为CA证书
这里我们假定你自己是CA,你在计算机中的身份以mycacert.cer来代表。
下面将代表CA的证书文件mycacert.cer安装在机器中,以便在计算机中确立mycacert.cer证书的权威性。
双击导出的证书文件mycacert.cer,出现下图所示的对话框。
单击对话框中的“安装证书”按钮,出现下图所示的“证书导入向导”对话框。
单击其中的“下一步”按钮,出现下图所示的“证书存储”对话框。
使用该对话框的默认选择,直接单击“下一步”按钮,出现正在完成证书导入向导的对话框。
以后操作系统将自动信任由mycacert.cer签发的其他证书。
单击其中的“完成”按钮,出现最后的确认对话框。
如果用户怀疑该证书是否正确,可以再核实一遍该对话框中显示的拇印,确认后单击其中的“是”按钮,最后提示导入成功。
此时双击证书文件mycacert.cer,将出现下图所示的“证书”对话框。
与原对话框相比,“该CA根证书不受信任。
。
。
。
。
。
”警告已经消失了,取而代之的是该证书的用途。
单击该对话框的“证书路径”标签,进入“证书路径”选项卡,出现下图所示的对话
框,其中显示了该证书是正确的。
二.创建被签发数字证书mycert
创建别名为mycert的被签发数字证书的过程与mycacert的创建过程中的前两步相同,注意在第一步提示输入“您的名字与姓氏?
”时,输入与mycacert不同的名字,如“wzh”。
同样将此证书导出到证书文件mycert.cer。
在windows中双击此证书文件将显示如下信息:
“该证书不受信任”的警告信息,颁发给和颁发者是同一个用户名wzh。
点击“证书”中的证书路径,显示信息如下:
三.使用Java程序签发数字证书。
实例说明:
本实例使用上面确定的CA“wangzhihui”(证书文件为mycacert.cer)对证书“wzh”(证书文件为mycert.cer)进行签发,该实例使我们对一些知名的证书签发机构(如Verisign)的CA是如何签发证书的有一个实际的了解。
编程思路:
CA签发数字证书应该使用自己的私钥,CA自身的证书中并不包含私钥信息,因此需要从密钥库mykeystore中提取。
此外,由于被签发的证书还需要知道CA的名字,这可以从CA的证书中获得。
签发证书实际上是创建了一个新的证书,本实例使用J2SDK内部使用的sun.security.x509包中的X509CertImpl类来创建新的证书,该类的构造器中传入有关新的证书的各种信息,主要信息来自被签发的mycert.cer,只是对某些必须修改的信息如序列号,有效期,签发者等进行重新设置。
最后使用X509CertImpl类的sign()方法用CA的私钥签名。
可以打印新的证书信息,也可以将其保存在密钥库中。
代码与分析:
完整代码如下:
importjava.io.*;
importjava.security.*;
importjava.security.cert.*;
importjava.util.*;
importjava.math.*;
importsun.security.x509.*;
publicclassSignCert{
publicstaticvoidmain(Stringargs[])throwsException{
char[]storepass="123456".toCharArray();
char[]cakeypass="abcdefg".toCharArray();
Stringalias="mycacert";
Stringname="mykeystore";
//签发者CertofCA-----mycacert
FileInputStreamin=newFileInputStream(name);
KeyStoreks=KeyStore.getInstance("JKS");
ks.load(in,storepass);
java.security.cert.Certificatec1=ks.getCertificate(alias);
PrivateKeycaprk=(PrivateKey)ks.getKey(alias,cakeypass);
in.close();
//得到签发者
byte[]encod1=c1.getEncoded();
X509CertImplcimp1=newX509CertImpl(encod1);
X509CertInfocinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+
"."+X509CertImpl.INFO);
X500Nameissuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+
"."+CertificateIssuerName.DN_NAME);
//Certof被签发者-----mycert
CertificateFactorycf=CertificateFactory.getInstance("X.509");
FileInputStreamin2=newFileInputStream(args[0]);
java.security.cert.Certificatec2=cf.generateCertificate(in2);
in2.close();
byte[]encod2=c2.getEncoded();
X509CertImplcimp2=newX509CertImpl(encod2);
X509CertInfocinfo2=(X509CertInfo)cimp2.get(
X509CertImpl.NAME+"."+X509CertImpl.INFO);
//设置新证书有效期
Datebegindate=newDate();
//60day
Dateenddate=newDate(begindate.getTime()+3000*24*60*60*1000L);CertificateValiditycv=newCertificateValidity(begindate,enddate);
cinfo2.set(X509CertInfo.VALIDITY,cv);
//设置新证书序列号
intsn=(int)(begindate.getTime()/1000);
CertificateSerialNumbercsn=newCertificateSerialNumber(sn);
cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
//设置新证书签发者
cinfo2.set(X509CertInfo.ISSUER+"."+
CertificateIssuerName.DN_NAME,issuer);
//设置新证书算法
AlgorithmIdalgorithm=
newAlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
cinfo2.set(CertificateAlgorithmId.NAME+
"."+CertificateAlgorithmId.ALGORITHM,algorithm);
//创建证书
X509CertImplnewcert=newX509CertImpl(cinfo2);
//签名
newcert.sign(caprk,"MD5WithRSA");
System.out.println(newcert);
//将签名后的证书signcert存入密钥库
ks.setCertificateEntry("signcert",newcert);
/*
PrivateKeyprk=(PrivateKey)ks.getKey("lf",
"wshr.ut".toCharArray());
java.security.cert.Certificate[]cchain={newcert};
ks.setKeyEntry("lf_signed",prk,
"newpass".toCharArray(),cchain);
*/
FileOutputStreamout=newFileOutputStream("mykeystore");
ks.store(out,"123456".toCharArray());
out.close();
}
}
运行程序:
将上面的代码保存为SignCert.java文件,编译并输入“javaSignCertmycert”运行程序,此程序的输入参数是被签发的证书文件名。
运行结果如下图所示。
或输入“javaSignCertmycert〉signcert.txt”运行程序,输出结果已重定向到文件signcert.txt文件中,打开文件可以看到有关新证书的信息。
四.数字证书签名后的发布
将签名后的数字证书signcert从密钥库中导出到证书文件signcert.cer。
在命令行中输入如下命令“keytool–export–aliassigncert–keystoremykeystore-storepass123456–filesigncert.cer–rfc”
CA通常将签名过的证书文件以e-mail的形式发送给对方,也可以用windows的记事本打开该证书文件,将其编码内容通过e-mail或web等方式发布。
其他人只要将其文本粘贴下来,保存到文件名以.cer为后缀的文本文件中即可。
该证书内容如图所示:
在windows中双击signcert.cer证书文件,将出现下图所示“证书”对话框。
我们可以看到签名前的警告信息已经没有了,且颁发者已经更换为“wangzhihui”。
而不再是自己给自己签名的证书。
“证书路径”中将显示证书间的关系。
附:
1.常用的其它keytool命令
-delete删除密钥库中的条目;
-keypassword修改密钥库中指定条目的口令;
-printcert显示证书文件的详细内容,–file参数指定要显示的证书文件的名称;
-import将证书文件倒入到新的密钥库,注意:
如果要导入signcert.cer,首先要导入CA“wangzhihui”的证书mycacert.cer,因为signcert.cer是由mycacert.cer签发的。
2.从windows中卸载证书:
启动IE浏览器,单击“工具”-“Internet选项”,在出现的对话框中单击“内容”标签,如下图所示。
点击其中的“证书”按钮,在出现的对话框中点击“受信任的根证书颁发机构”,在显示的证书中找到“wangzhihui”证书,单击删除,随后出现两次提示,单击“是”按钮确认删除。
Windows将不再信任CA“wangzhihui”的证书,也就不再信任“wangzhihui”所签发的证书。
此时双击signcert.cer将显示windows没有足够信息,不能验证该证书。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 指导 数字证书