您的位置:首页 > 编程语言 > Java开发

Java中使用密钥库和算法创建数字证书

2011-06-30 15:44 197 查看
  keytool程序运行时加上命令行参数–genkey即可。

  在命令行中输入“keytool –genkey”将自动使用默认的算法生成公钥和私钥,并以交互方式获得公钥持有者的信息。其交互过程如下,其中带下划线的字符为用户键盘输入的内容,其他为系统提示的内容

  C:/>keytool -genkey

  输入keystore密码: 123456

  您的名字与姓氏是什么?

  [Unknown]: Liao Weimin1

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

  [Unknown]: Network Center

  您的组织名称是什么?

  [Unknown]: Guangzhou University

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

  [Unknown]: ZB

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

  [Unknown]: Guangzhou

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

  [Unknown]: CN

  CN=Liao Weimin1, OU=Network Center, O=Guangzhou University, L=ZB, ST=Guangzhou, C=CN 正确吗?

  [否]: 是

  输入的主密码

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

  C:/>

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

  同时上述操作将创建一个数字证书,证书中包含了新生成的公钥和一个名字为“CN=Liao Weimin1, OU=Network
Center, O=Guangzhou University, L=ZB, ST=Guangzhou,
C=CN”的主体(人或机构)的对应关系。其中“CN=Liao Weimin1, OU=Network Center, O=Guangzhou
University, L=ZB, ST=Guangzhou,
C=CN”是X.500格式的全名,包含了主体的国家、州、城市、机构、单位和名字。这样,这个证书将证明相应的公钥是这个人或机构所拥有的。

  以上生成的公钥、私钥和证书都保存在用户的主目录中创建一个默认的文件“.keystore”中。如果是Windows
2000系统,用户主目录是c:/ Documents and Setting/用户名。

  由于“.keystore”中包含了私钥,所以是一个需要保密的文件,因此上述操作提示为该文件设置一个密码:“输入keystore密码”,
这里因为是第一次使用该密钥库,因此输入的密码“123456”将成为该默认的密钥库的密码(实际使用时应该设置复杂的口令)。以后再使用这个密钥库时必
须提供这个口令才可以使用。

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

1.1.2 使用别名

  密钥库中可以存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分。1.1.1小节在使用keytool工具时没有指
定别名,因此系统使用了默认的别名mykey。如果再次运行“keytool –genkey”,则系统将提示“keytool错误:
java.lang.Exception: 没有创建键值对,别名 已经存在”,因此当密钥库中有多个公钥/私钥对和证书时,应该使用别名。

  ★ 实例说明

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

  ★运行程序

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

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

  C:/>keytool genkey alias liaoweimin2

  输入keystore密码: 123456

  您的名字与姓氏是什么?

  [Unknown]: Liao Weimin2

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

  [Unknown]: Network Center

  您的组织名称是什么?

  [Unknown]: SHU

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

  [Unknown]: ZB

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

  [Unknown]: SH

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

  [Unknown]: CN

  CN=Liao Weimin2, OU=Network Center, O=SHU, L=ZB, ST=SH, C=CN 正确吗?

  [否]: 是

  输入的主密码

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

  其中“输入keystore密码:”后面输入的内容必须和1.1.1小节相同的密码,否则将无法访问密钥库,并提示如下错误:“keytool
错误: java.io.IOException: Keystore was tampered with, or password was
incorrect”,这是因为1.1.1小节已经为默认的密钥库设置了该密码,以后使用该密钥库都必须提供该密码。

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

  以上操作将在用户主目录的“.keystore”文件中增加一对公钥和私钥(DSA算法),同时增加一个数字证书,证书中包含了新生成的公钥和
一个名字为“CN=Liao Weimin2, OU=Network Center, O=Guangzhou University, L=ZB,
ST=Guangzhou, C=CN”的主体(人或机构)的对应关系。

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

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

  ★ 实例说明

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

  ★运行程序

  keytool的keyalg参数可以指定密钥的算法,如果需要指定密钥的长度,可以再加上keysize参数。密钥长度默认为1024位,使用DSA算法时,密钥长度必须在512到1024之间,并且是64的整数倍。

  Keytool的-keystore参数可以指定密钥库的名称。密钥库其实是存放密钥和证书的文件,密钥库对应的文件如果不存在自动创建。

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

  如在命令行中输入“keytool genkey alias mytest keyalg RSA keysize 1024
keystore mykeystore validity
4000”将使用RSA算法生成1024位的公钥/私钥对及整数,密钥长度为1024位,证书有效期为4000天。使用的密钥库为mykeystore文
件。

 C:/java/ch5>keytool genkey alias mytest keyalg RSA keysize 1024 keystore mykeystore validity 4000

  输入keystore密码: wshr.ut

  您的名字与姓氏是什么?

  [Unknown]: Liao Weimin

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

  [Unknown]: Network Center

  您的组织名称是什么?

  [Unknown]: Guangzhou University

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

  [Unknown]: ZB

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

  [Unknown]: Guangzhou

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

  [Unknown]: CN

  CN=Liao Weimin, OU=Network Center, O=Guangzhou University, L=ZB, ST=Guangzhou, C=CN 正确吗?

  [否]: 是

  输入的主密码

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

  C:/java/ch5>

  由于当前目录下没有mykeystore文件,因此以上操作将在当前目录建立文件名为mykeystore的文件,并提示输入一个密码加以保
护:“输入keystore密码:”。因为这里使用的密钥库和1.1.1小节及1.1.2小节不是同一个文件,因此这里输入的密码和1.1.1小节及
1.1.2小节没有必要一致,这里不妨设置为“wshr.ut”。这样,以后再使用这个密钥库文件时必须提供该密码。

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

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

  ★ 实例说明

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

  ★运行程序

  使用keytool的export参数可以将别名指定的证书导出到文件,文件名通过file参数指定。如输入如下命令:

  C:/java/ch5>keytool export alias liaoweimin2 -file liaoweimin2.cer

  输入keystore密码: 123456

  保存在文件中的认证

  则将默认密钥库中的liaoweimin2条目对应的证书导出到文件liaoweimin2.cer中。由于命令行中没有用storepass给出密码,因此屏幕提示输入keystore密码。由于证书中不包含私钥,因此不需要条目的主密码。

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

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

  C:/java/ch5>keytool export alias lf file lf.cer keystore lfkeystore –storepass wshr.ut

  保存在文件中的认证

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

  如果用文本编辑器打开liaoweimin2.cer或lf.cer,将会发现它是二进制文件,有些内容无法显示,这不利于公布证书。在导出证书时加上-rfc参数则可以使用一种可打印的编码格式来保存证书。如:

  C:/java/ch5> keytool export alias mytest file mytest.cer keystore mykeystore -storepass wshr.ut -rfc

  保存在文件中的认证

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

  1.2.2 使用Keytool从文件中显示证书

  ★ 实例说明

  本实例使用J2SDK提供的keytool工具将1.2.3小节导出的证书文件显示出来。

  ★运行程序

  使用keytool的printcert参数可以将1.2.3小节导出到证书文件详细内容显示出来,文件名称通过file参数指定。如:

  C:/java/ch5>keytool printcert file lf.cer

  (见自己的屏幕)

  对编码过的证书可以同样显示,如:

  C:/java/ch5>keytool printcert file mytest.cer

  (见自己的屏幕)

  1.2.3 在Windows
中从文件显示证书

  ★ 实例说明

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

  ★运行程序

  1.2.3小节导出的证书文件中,只要文件名以.cer为后缀,Windows操作系统就可以直接识别。如在Windows中双击lf.cer图标,将出现窗口。其中包含了证书的所有者、颁发者、有效期等信息,这些信息和使用keytool显示出的信息一致。

  由于该证书是用自己的私钥对该证书进行数字签名的,即自己给自己签发的证书,因此窗口中显示警告信息:“该证书发行机构根证书没受信任”。

  假设您用 jarsigner 工具来签名 Java
归档 (JAR) 文件。需要使用这一文件的客户机将认证您的签名。

  认证签名的一种方法是先将您的公钥证书作为“可信任”项导入它们的密钥仓库中。您可以将证书导出并将其提供给客户机。例如,假设项的别名为“mykey”,您可以用以下命令将您的证书导出到名为 MJ.cer 的文件中:

  keytool -export -alias mykey -file MJ.cer

  有了该证书以及已被签名的 JAR 文件,客户机就可以用 jarsigner 工具来认证您的签名。

  更改特征名但保留密钥对

  假设,譬如说因为您换了部门或搬到另一个城市去了而改变了您的特征名。如果愿意,您仍然可以使用您先前使用的公钥/私钥对而只对特征名进行更新。例如,假设您的名字叫 Susan Miller,并用别名 sMiller 和以下的特征名创建了初始密钥项:

  "cn=Susan Miller, ou=Finance Department, o=BlueSoft, c=us"

  假设您从财务部门换到了会计部门。您仍然可使用先前所生成的公钥/私钥对,而用以下方法对特征名进行更新。首先,复制您的密钥项:

  keytool -keyclone -alias sMiller -dest sMillerNew

  (您将得到要求输入密钥仓库口令和初始密钥口令及目标密钥口令的提示,因为在命令行没有提供这些信息。)现在,您需要更改与复制项关联的证书链以使链中的第一个证书使用您的新特征名。先用相应名称生成自签名证书:

  keytool -selfcert -alias sMillerNew

  -dname "cn=Susan Miller, ou=Accounting Department, o=BlueSoft, c=us"

  然后根据该新证书中的信息生成证书签名请求:

  keytool -certreq -alias sMillerNew

  当您得到 CA 认证答复后,将其导入:

  keytool -import -alias sMillerNew -file VSSMillerNew.cer

  导入认证答复后,您也许会要删除使用旧特征名的初始密钥项:

  keytool -delete -alias sMiller

  将认证后的CA根证书导入密钥库,以便于用这个公钥证书来进行认证签名其它的证书:

  keytool -import -trustcacerts -alias zhky -keystore tu.jks -file xtl.cer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: