广东工业大学网络与信息安全数字证书资料.docx

上传人:b****6 文档编号:6454127 上传时间:2023-01-06 格式:DOCX 页数:18 大小:161.56KB
下载 相关 举报
广东工业大学网络与信息安全数字证书资料.docx_第1页
第1页 / 共18页
广东工业大学网络与信息安全数字证书资料.docx_第2页
第2页 / 共18页
广东工业大学网络与信息安全数字证书资料.docx_第3页
第3页 / 共18页
广东工业大学网络与信息安全数字证书资料.docx_第4页
第4页 / 共18页
广东工业大学网络与信息安全数字证书资料.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

广东工业大学网络与信息安全数字证书资料.docx

《广东工业大学网络与信息安全数字证书资料.docx》由会员分享,可在线阅读,更多相关《广东工业大学网络与信息安全数字证书资料.docx(18页珍藏版)》请在冰豆网上搜索。

广东工业大学网络与信息安全数字证书资料.docx

广东工业大学网络与信息安全数字证书资料

1数字证书的创建

数字证书的主要功能是保存公钥和某个人或机构的对应关系,本节介绍几种数字证书的创建方法。

它们都使用了keytool工具的-genkey参数。

1.1使用默认的密钥库和算法创建数字证书

★实例说明

本实例使用J2SDK提供的keytool工具用默认的密钥库和算法创建几个数字证书。

★运行程序

keytool程序运行时加上命令行参数–genkey即可。

在命令行中输入“keytool–genkey”将自动使用默认的算法生成公钥和私钥,并以交互方式获得公钥持有者的信息。

其交互过程如下,其中带下划线的字符为用户键盘输入的内容,其他为系统提示的内容。

C:

\>keytool-genkey

输入keystore密码:

123456

您的名字与姓氏是什么?

[Unknown]:

XuYingxiao1

您的组织单位名称是什么?

[Unknown]:

NetworkCenter

您的组织名称是什么?

[Unknown]:

ShanghaiUniversity

您所在的城市或区域名称是什么?

[Unknown]:

ZB

您所在的州或省份名称是什么?

[Unknown]:

Shanghai

该单位的两字母国家代码是什么

[Unknown]:

CN

CN=XuYingxiao1,OU=NetworkCenter,O=ShanghaiUniversity,L=ZB,ST=Shanghai,C=CN正确吗?

[否]:

输入的主密码

(如果和keystore密码相同,按回车):

abcdefg

C:

\>

如果使用中文操作系统,上述操作中输入的“是”不能用英文“yes”代替。

如果没有DOS下的中文输入系统的话,可以在Windows的“记事本”中输入一个中文字符“是”,然后点击DOS窗口左上角的图标,选择“编辑/粘贴”菜单,或直接点击窗口中的

工具将中文字符“是”粘贴到DOS窗口,如图5-1所示。

图5-1将中文字符粘贴到DOS窗口

以上操作将生成一个公钥和一个私钥,这里并未指定使用何算法,将使用默认的DSA算法。

同时上述操作将创建一个数字证书,证书中包含了新生成的公钥和一个名字为“CN=XuYingxiao1,OU=NetworkCenter,O=ShanghaiUniversity,L=ZB,ST=Shanghai,C=CN”的主体(人或机构)的对应关系。

其中“CN=XuYingxiao1,OU=NetworkCenter,O=ShanghaiUniversity,L=ZB,ST=Shanghai,C=CN”是X.500格式的全名,包含了主体的国家、州、城市、机构、单位和名字。

这样,这个证书将证明相应的公钥是这个人或机构所拥有的。

以上生成的公钥、私钥和证书都保存在用户的主目录中创建一个默认的文件“.keystore”中。

如果使用的是Window98操作系统,用户的主目录是c:

\windows,在该目录下可以找到“.keystore”文件。

如果是Windows2000系统,用户主目录是c:

\DocumentsandSetting\用户名。

由于“.keystore”中包含了私钥,所以是一个需要保密的文件,因此上述操作提示为该文件设置一个密码:

“输入keystore密码”,这里因为是第一次使用该密钥库,因此输入的密码“123456”将成为该默认的密钥库的密码(实际使用时应该设置复杂的口令)。

以后再使用这个密钥库时必须提供这个口令才可以使用。

以上操作最后还提示“输入的主密码”,这里“mykey”是默认的别名,使用该名字可以在密钥库“.keystore”中找到对应的公钥、私钥和证书。

此处输入的密码是对应于该别名的私钥的密码,密钥库中每个别名可以使用不同的密码加以保护。

1.2使用别名

密钥库中可以存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分。

1.1小节在使用keytool工具时没有指定别名,因此系统使用了默认的别名mykey。

如果再次运行“keytool–genkey”,则系统将提示“keytool错误:

java.lang.Exception:

没有创建键值对,别名已经存在”,因此当密钥库中有多个公钥/私钥对和证书时,应该使用别名。

★实例说明

本实例使用J2SDK提供的keytool工具用在默认的密钥库中利用别名增加多个证书。

★运行程序

keytool程序运行时加上命令行参数–alias即可。

在命令行中输入“keytool–genkey–aliasxuyingxiao2”将自动使用默认的算法生成别名为xuyingxiao2的公钥和私钥,并以交互方式获得公钥持有者的信息。

其交互过程如下:

C:

\>keytool-genkey-aliasxuyingxiao2

输入keystore密码:

123456

您的名字与姓氏是什么?

[Unknown]:

XuYingxiao2

您的组织单位名称是什么?

[Unknown]:

NetworkCenter

您的组织名称是什么?

[Unknown]:

SHU

您所在的城市或区域名称是什么?

[Unknown]:

ZB

您所在的州或省份名称是什么?

[Unknown]:

SH

该单位的两字母国家代码是什么

[Unknown]:

CN

CN=XuYingxiao2,OU=NetworkCenter,O=SHU,L=ZB,ST=SH,C=CN正确吗?

[否]:

输入的主密码

(如果和keystore密码相同,按回车):

 

其中“输入keystore密码:

”后面输入的内容必须和5.1.1小节相同的密码,否则将无法访问密钥库,并提示如下错误:

“keytool错误:

java.io.IOException:

Keystorewastamperedwith,orpasswordwasincorrect”,这是因为5.1.1小节已经为默认的密钥库设置了该密码,以后使用该密钥库都必须提供该密码。

在“输入的主密码”的提示后这里不妨直接按“回车键”,这样该私钥将使用和密钥库相同的密码“123456”来保护。

以上操作将在用户主目录的“.keystore”文件(如对于Windows98用户是c:

\windows\.keystore)中增加一对公钥和私钥(DSA算法),同时增加一个数字证书,证书中包含了新生成的公钥和一个名字为“CN=XuYingxiao2,OU=NetworkCenter,O=ShanghaiUniversity,L=ZB,ST=Shanghai,C=CN”的主体(人或机构)的对应关系。

1.3使用指定的算法和密钥库和有效期

1.1和1.2小节中使用的是默认的算法和密钥库,本节介绍如何自己指定算法和密钥库。

★实例说明

本实例使用J2SDK提供的keytool工具用RSA算法和在指定的密钥库mykeystore中创建公钥/私钥对和证书。

★运行程序

keytool的-keyalg参数可以指定密钥的算法,如果需要指定密钥的长度,可以再加上-keysize参数。

密钥长度默认为1024位,使用DSA算法时,密钥长度必须在512到1024之间,并且是64的整数倍。

Keytool的-keystore参数可以指定密钥库的名称。

密钥库其实是存放密钥和证书的文件,密钥库对应的文件如果不存在自动创建。

-validity参数可以指定所创建的证书有效期是多少天。

如在命令行中输入“keytool-genkey-aliasmytest-keyalgRSA-keysize1024-keystoremykeystore-validity4000”将使用RSA算法生成1024位的公钥/私钥对及整数,密钥长度为1024位,证书有效期为4000天。

使用的密钥库为mykeystore文件。

C:

\java\ch5>keytool-genkey-aliasmytest-keyalgRSA-keysize1024-keystoremykeystore-validity4000

输入keystore密码:

wshr.ut

您的名字与姓氏是什么?

[Unknown]:

XuYingxiao

您的组织单位名称是什么?

[Unknown]:

NetworkCenter

您的组织名称是什么?

[Unknown]:

ShanghaiUniversity

您所在的城市或区域名称是什么?

[Unknown]:

ZB

您所在的州或省份名称是什么?

[Unknown]:

Shanghai

该单位的两字母国家代码是什么

[Unknown]:

CN

CN=XuYingxiao,OU=NetworkCenter,O=ShanghaiUniversity,L=ZB,ST=Shanghai,C=CN正确吗?

[否]:

输入的主密码

(如果和keystore密码相同,按回车):

C:

\java\ch5>

由于当前目录下没有mykeystore文件,因此以上操作将在当前目录建立文件名为mykeystore的文件,并提示输入一个密码加以保护:

“输入keystore密码:

”。

因为这里使用的密钥库和1.1小节及1.2小节不是同一个文件,因此这里输入的密码和1.1小节及1.2小节没有必要一致,这里不妨设置为“wshr.ut”。

这样,以后再使用这个密钥库文件时必须提供该密码。

对其中的“输入的主密码”,这里不妨直接按回车键,这样mykeysotre文件中的mytest条目将使用和密钥库相同的密码:

“wshr.ut”。

2数字证书的显示

5.1节用各种方式创建了多个数字证书,本节使用各种方式显示这些数字证书的信息,它们有的使用keytool工具的-list参数,有的直接通过Java编程来实现。

2.1使用Keytool直接从密钥库显示条目信息

★实例说明

本实例使用J2SDK提供的keytool工具直接从密钥库中显示证书信息。

★运行程序

keytool的命令行参数-list可以显示密钥库中的证书信息,如输入:

keytool–list

则显示默认的密钥库中的证书信息。

如下:

C:

\java\ch5>keytool-list

输入keystore密码:

123456

Keystore类型:

jks

Keystore提供者:

SUN

您的keystore包含2输入

xuyingxiao2,2002-11-22,keyEntry,

认证指纹(MD5):

65:

C9:

FD:

8C:

82:

C7:

36:

E1:

7C:

D9:

AD:

9A:

34:

25:

5C:

71

mykey,2002-11-22,keyEntry,

认证指纹(MD5):

BE:

F1:

9F:

45:

5F:

4E:

02:

FF:

94:

83:

39:

73:

E1:

F5:

59:

9C

程序开始要求输入密钥库的密码,在5.1.1小节我们已经为默认密钥库设置了密码“123456”,因此这里必须输入相同的密码才能使用密钥库。

在1.1和1.2小节我们已向默认的密钥库中添加了两个条目:

mykey和xuyingxiao2,在此处的输出信息中可以看到这两个条目的名称、创建日期、条目类型(keyEntry,密钥条目)以及认证指纹。

认证指纹其实是该条目的消息摘要。

如果进一步使用-alias参数则可以显示指定的条目的信息,如:

C:

\java\ch5>keytool-list-aliasxuyingxiao2

输入keystore密码:

123456

xuyingxiao2,2002-11-22,keyEntry,

认证指纹(MD5):

65:

C9:

FD:

8C:

82:

C7:

36:

E1:

7C:

D9:

AD:

9A:

34:

25:

5C:

71

如果进一步使用-keystore参数则可以显示指定的密钥库中的证书信息,如:

C:

\java\ch5>keytool-list-keystoremykeystore

输入keystore密码:

wshr.ut

Keystore类型:

jks

Keystore提供者:

SUN

您的keystore包含2输入

mytest,2002-12-5,keyEntry,

认证指纹(MD5):

B2:

DC:

75:

CD:

60:

B7:

1E:

7A:

97:

EE:

E8:

A4:

31:

D6:

26:

C6

tmp,2002-12-5,keyEntry,

认证指纹(MD5):

5C:

FA:

ED:

8E:

AE:

30:

1B:

2B:

CF:

39:

ED:

4D:

6F:

94:

E1:

6B

2.2使用Keytool直接从密钥库显示证书详细信息

★实例说明

本实例使用J2SDK提供的keytool工具直接从密钥库中显示证书的详细信息。

★运行程序

2.1的各个命令加上-v参数可以显示证书的详细信息,如:

C:

\java\ch5>keytool-list-v-keystorelfkeystore-aliaslf

别名名称:

lf

创建日期:

2002-12-5

输入类型:

KeyEntry

认证链长度:

1

认证[1]:

Owner:

CN=LiuFang,OU=Packaging,O=ShanghaiUniversity,L=ZB,ST=Shanghai,

发照者:

CN=LiuFang,OU=Packaging,O=ShanghaiUniversity,L=ZB,ST=Shangha

CN

序号:

3deec441

有效期间:

ThuDec0511:

13:

05CST2002至:

ThuJul0511:

13:

05CST2012

认证指纹:

MD5:

55:

73:

8D:

16:

05:

E1:

F8:

5F:

F8:

25:

C7:

29:

C3:

D6:

48:

67

SHA1:

3F:

75:

6A:

DC:

E7:

7B:

32:

64:

C5:

99:

1E:

CC:

9B:

9E:

77:

88:

59:

21:

C2:

33

其中包含了发照者(签发者)、序号、有效期、MD5和SHA1认证指纹等额外信息,其含义在本章后续内容中将涉及。

2.3使用Keytool将数字证书导出到文件

★实例说明

本实例使用J2SDK提供的keytool工具将指定的证书从密钥库导出为编码过和没编码过两种格式的文件。

★运行程序

使用keytool的-export参数可以将别名指定的证书导出到文件,文件名通过-file参数指定。

如输入如下命令:

C:

\java\ch5>keytool-export-aliasxuyingxiao2-filexuyingxiao2.cer

输入keystore密码:

123456

保存在文件中的认证

则将默认密钥库中的xuyingxiao2条目对应的证书导出到文件xuyingxiao2.cer中。

由于命令行中没有用storepass给出密码,因此屏幕提示输入keystore密码。

由于证书中不包含私钥,因此不需要条目的主密码。

该操作完成后将在当前目录中创建xuyingxiao2.cer文件,该文件即是默认密钥库中的xuyingxiao2条目对应的证书,它包含了公钥和主体的对应关系,内容也可以公开。

输入如下命令则可以指定密钥库:

C:

\java\ch5>keytool-export-aliaslf-filelf.cer-keystorelfkeystore–storepasswshr.ut

保存在文件中的认证

该操作完成后将在当前目录中创建lf.cer文件。

如果用文本编辑器打开xuyingxiao2.cer或lf.cer,将会发现它是二进制文件,有些内容无法显示,这不利于公布证书。

在导出证书时加上-rfc参数则可以使用一种可打印的编码格式来保存证书。

如:

C:

\java\ch5>keytool-export-aliasmytest-filemytest.cer-keystoremykeystore-storepasswshr.ut-rfc

保存在文件中的认证

则当前目录下将增加一个文件mytest.cer,其内容是编码过的,可以在屏幕上显示、拷贝或打印。

如图2所示。

图2编码后的证书内容

2.4在Windows中从文件显示证书

★实例说明

本实例在Windows中直接显示2.3小节导出的证书文件。

★运行程序

2.3小节导出的证书文件中,只要文件名以.cer为后缀,Windows操作系统就可以直接识别。

如在Windows中双击lf.cer图标,将出现图5-3所示证书窗口。

其中包含了证书的所有者、颁发者、有效期等信息,这些信息和5.2.4小节使用keytool显示出的信息一致。

由于该证书是用自己的私钥对该证书进行数字签名的,即自己给自己签发的证书,因此窗口中显示警告信息:

“该证书发行机构根证书没受信任”。

在后续章节中将介绍证书的签发问题。

图3证书的常规信息

 

点击图3的“详细资料”,可以看到证书的版本、序号、签名算法、颁发者、有效期、主题(即全名)、公钥算法、拇印算法、拇印等信息。

其中的拇印即认证指纹图4所示。

图4证书的详细信息

同样,点击编码过的证书文件如mytest.cer可以看到类似信息。

3Java程序签发数字证书

实例说明

本实例假设已创建证书“XuYingxiao”和证书“LiuFang”,使用证书“XuYingxiao”对证书“LiuFang”进行签发,该实例使我们对CA是如何签发证书的有一个实际的了解。

★编程思路:

CA签发数字证书应该使用自己的私钥,CA自身的证书中并不包含私钥信息,因此需从密钥库mykeystore中提取。

此外,由于被签发的证书还需要知道CA的名字,这可以从CA的证书中获得。

签发证书实际上是创建了一个新的证书,本实例使用J2SDK内部使用的sun.security.x509包中的X509CertImpl类来创建新的证书,该类的构造器中传入有关新的证书各种信息,主要信息来自被签发的lf.cer,只是对某些必须修改的信息如序列号、有效期、签发者等进行重新设置。

最后使用X509CertImpl类的sign()方法用CA的私钥进行签名。

可以打印新的证书的信息,也可以将其保存在密钥库中。

具体步骤如下:

(1)从密钥库读取CA的证书

FileInputStreamin=newFileInputStream(name);

KeyStoreks=KeyStore.getInstance("JKS");

ks.load(in,storepass);

java.security.cert.Certificatec1=ks.getCertificate(alias);

分析:

这里name的值为“mykeystore”,alias的值为“mytest”。

(2)从密钥库读取CA的私钥

PrivateKeycaprk=(PrivateKey)ks.getKey(alias,cakeypass);

分析:

该步骤执行KeyStore对象的getKey()方法,获取其参数对应的条目的私钥,保护私钥的口令也通过方法的参数传入。

该口令必须和创建证书时所输入的“主密码”相同。

所获得的私钥用于后面的签名。

(3)从CA的证书中提取签发者信息

byte[]encod1=c1.getEncoded();

X509CertImplcimp1=newX509CertImpl(encod1);

X509CertInfocinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+

"."+X509CertImpl.INFO);

X500Nameissuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+

"."+CertificateIssuerName.DN_NAME);

分析:

首先提取CA的证书的编码,然后用该编码创建X509CertImpl类型的对象,通过该对象的get()方法获取X509CertInfo类型的对象,该对象封装了证书的全部内容,最后通过该对象的get()方法获得X500Name类型的签发者信息。

这些类在J2SDK1.4的API文档中并无介绍,但可以直接使用。

(4)获取待签发的证书

CertificateFactorycf=CertificateFactory.getInstance("X.509");

FileInputStreamin2=newFileInputStream(args[0]);

java.security.cert.Certificatec2=cf.generateCertificate(in2);

分析:

待签发的证书从导出的证书文件读取。

(5)从待签发的证书提取证书信息

byte[]encod2=c2.getEncoded();

X509CertImplcimp2=newX509CertImpl(encod2);

X509CertInfocinfo2=(X509CertInfo)cimp2.get(

X509CertImpl.NAME+"."+X509CertImpl.INFO);

分析:

新证书的主要信息来自待签发的证书,待签发的证书中这些信息主要封装在X509CertInfo对象中,所以和第3步类似,先提取待签发者的证书编码,然后创建X509CertImpl类型的对象,最后通过该对象的get()方法获取X509CertInfo类型的对象。

以后就可以使用该对象创建新的证书了,再创建新证书之前,还需要使用其set()方法对其中部分信息作一些必要的修改。

(6)设置新证书有效期

Datebegindate=newDate();

//30000day

Dateenddate=newDate(begindate.getTime()+3000*24*60*60*1000L);

CertificateValiditycv=newCertificateValidity(begindate,enddate);

cinfo2.set(X509CertInfo.VALIDITY,cv);

分析:

新证书的开始生效时间不妨从签发之时开始,因此首先使用newDate()获取当前时间。

新证书截止日期不能超过CA,作为测试,这里不妨设置截止日期为3000天以后,因此使用newDate()再创建一个日期对象,其参数传入长整型的值,即在原先日期的基础上增加3000天的时间(毫秒数)。

最后通过这两个日期创建CertificateValidity类型的对象,并把它作为参数传递给上一步得到的X509CertInfo对象的set()方法以设置有效期。

(7)设置新证书序列号

intsn=(int)(begindate.getTime()/1000);

Certificat

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1