★ 实例说明
本实例使用JSDK提供的keytool工具用默认的密钥库和算法创建几个数字证书
★运行程序
keytool程序运行时加上命令行参数–genkey即可
在命令行中输入keytool –genkey将自动使用默认的算法生成公钥和私钥并以交互方式获得公钥持有者的信息其交互过程如下其中带下划线的字符为用户键盘输入的内容其他为系统提示的内容
C:\>keytool genkey
输入keystore密码
您的名字与姓氏是什么?
[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 密码相同按回车) abcdefg
C:\>
以上操作将生成一个公钥和一个私钥这里并未指定使用何算法将使用默认的DSA算法
同时上述操作将创建一个数字证书证书中包含了新生成的公钥和一个名字为CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN的主体(人或机构)的对应关系其中CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN是X格式的全名包含了主体的国家州城市机构单位和名字这样这个证书将证明相应的公钥是这个人或机构所拥有的
以上生成的公钥私钥和证书都保存在用户的主目录中创建一个默认的文件keystore中如果是Windows 系统用户主目录是c:\ Documents and Setting\用户名
由于keystore中包含了私钥所以是一个需要保密的文件因此上述操作提示为该文件设置一个密码输入keystore密码这里因为是第一次使用该密钥库因此输入的密码将成为该默认的密钥库的密码(实际使用时应该设置复杂的口令)以后再使用这个密钥库时必须提供这个口令才可以使用
以上操作最后还提示输入的主密码这里mykey是默认的别名使用该名字可以在密钥库keystore中找到对应的公钥私钥和证书此处输入的密码是对应于该别名的私钥的密码密钥库中每个别名可以使用不同的密码加以保护
使用别名
密钥库中可以存放多个条目(公钥/私钥对和证书)它们在密钥库中以别名(alias)区分小节在使用keytool工具时没有指定别名因此系统使用了默认的别名mykey如果再次运行keytool –genkey则系统将提示keytool错误 javalangException: 没有创建键值对别名 已经存在因此当密钥库中有多个公钥/私钥对和证书时应该使用别名
★ 实例说明
本实例使用JSDK提供的keytool工具用在默认的密钥库中利用别名增加多个证书
★运行程序
keytool程序运行时加上命令行参数–alias即可
在命令行中输入keytool –genkey –alias liaoweimin将自动使用默认的算法生成别名为liaoweimin的公钥和私钥并以交互方式获得公钥持有者的信息其交互过程如下
C:\>keytool genkey alias liaoweimin
输入keystore密码
您的名字与姓氏是什么?
[Unknown] Liao Weimin
您的组织单位名称是什么?
[Unknown] Network Center
您的组织名称是什么?
[Unknown] SHU
您所在的城市或区域名称是什么?
[Unknown] ZB
您所在的州或省份名称是什么?
[Unknown] SH
该单位的两字母国家代码是什么
[Unknown] CN
CN=Liao Weimin OU=Network Center O=SHU L=ZB ST=SH C=CN 正确吗?
[否] 是
输入的主密码
(如果和 keystore 密码相同按回车)
其中输入keystore密码后面输入的内容必须和小节相同的密码否则将无法访问密钥库并提示如下错误keytool错误 javaioIOException: Keystore was tampered with or password was incorrect这是因为小节已经为默认的密钥库设置了该密码以后使用该密钥库都必须提供该密码
在输入 的主密码的提示后这里不妨直接按回车键这样该私钥将使用和密钥库相同的密码来保护
以上操作将在用户主目录的keystore文件中增加一对公钥和私钥(DSA算法)同时增加一个数字证书证书中包含了新生成的公钥和一个名字为CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN的主体(人或机构)的对应关系
使用指定的算法和密钥库和有效期
和小节中使用的是默认的算法和密钥库本节介绍如何自己指定算法和密钥库
★ 实例说明
本实例使用JSDK提供的keytool工具用RSA算法和在指定的密钥库mykeystore中创建公钥/私钥对和证书
★运行程序
keytool的keyalg参数可以指定密钥的算法如果需要指定密钥的长度可以再加上keysize参数密钥长度默认为位使用DSA算法时密钥长度必须在到之间并且是的整数倍
Keytool的keystore参数可以指定密钥库的名称密钥库其实是存放密钥和证书的文件密钥库对应的文件如果不存在自动创建
validity参数可以指定所创建的证书有效期是多少天
如在命令行中输入keytool genkey alias mytest keyalg RSA keysize keystore mykeystore validity 将使用RSA算法生成位的公钥/私钥对及整数密钥长度为位证书有效期为天使用的密钥库为mykeystore文件
C:\java\ch>keytool genkey alias mytest keyalg RSA keysize keystore mykeystore validity
输入keystore密码 wshrut
您的名字与姓氏是什么?
[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\ch>
由于当前目录下没有mykeystore文件因此以上操作将在当前目录建立文件名为mykeystore的文件并提示输入一个密码加以保护输入keystore密码因为这里使用的密钥库和小节及小节不是同一个文件因此这里输入的密码和小节及小节没有必要一致这里不妨设置为wshrut这样以后再使用这个密钥库文件时必须提供该密码
对其中的输入的主密码这里不妨直接按回车键这样mykeysotre文件中的mytest条目将使用和密钥库相同的密码wshrut
使用Keytool将数字证书导出到文件
★ 实例说明
本实例使用JSDK提供的keytool工具将指定的证书从密钥库导出为编码过和没编码过两种格式的文件
★运行程序
使用keytool的export参数可以将别名指定的证书导出到文件文件名通过file参数指定如输入如下命令
C:\java\ch>keytool export alias liaoweimin file liaoweimincer
输入keystore密码
保存在文件中的认证
则将默认密钥库中的liaoweimin条目对应的证书导出到文件liaoweimincer中由于命令行中没有用storepass给出密码因此屏幕提示输入keystore密码由于证书中不包含私钥因此不需要条目的主密码
该操作完成后将在当前目录中创建liaoweimincer文件该文件即是默认密钥库中的liaoweimin条目对应的证书它包含了公钥和主体的对应关系内容也可以公开
输入如下命令则可以指定密钥库
C:\java\ch>keytool export alias lf file lfcer keystore lfkeystore –storepass wshrut
保存在文件中的认证
该操作完成后将在当前目录中创建lfcer文件
如果用文本编辑器打开liaoweimincer或lfcer将会发现它是二进制文件有些内容无法显示这不利于公布证书在导出证书时加上rfc参数则可以使用一种可打印的编码格式来保存证书如
C:\java\ch> keytool export alias mytest file mytestcer keystore mykeystore storepass wshrut rfc
保存在文件中的认证
则当前目录下将增加一个文件mytestcer其内容是编码过的可以在屏幕上显示拷贝或打印如图所示(打印内容不同)
使用Keytool从文件中显示证书
★ 实例说明
本实例使用JSDK提供的keytool工具将小节导出的证书文件显示出来
★运行程序
使用keytool的printcert参数可以将小节导出到证书文件详细内容显示出来文件名称通过file参数指定如
C:\java\ch>keytool printcert file lfcer
(见自己的屏幕)
对编码过的证书可以同样显示如
C:\java\ch>keytool printcert file mytestcer
(见自己的屏幕)
在Windows中从文件显示证书
★ 实例说明
本实例在Windows中直接显示小节导出的证书文件
★运行程序
小节导出的证书文件中只要文件名以cer为后缀Windows操作系统就可以直接识别如在Windows中双击lfcer图标将出现窗口其中包含了证书的所有者颁发者有效期等信息这些信息和使用keytool显示出的信息一致
由于该证书是用自己的私钥对该证书进行数字签名的即自己给自己签发的证书因此窗口中显示警告信息该证书发行机构根证书没受信任
假设您用 jarsigner 工具来签名 Java 归档 (JAR) 文件需要使用这一文件的客户机将认证您的签名
认证签名的一种方法是先将您的公钥证书作为可信任项导入它们的密钥仓库中您可以将证书导出并将其提供给客户机例如假设项的别名为mykey您可以用以下命令将您的证书导出到名为 MJcer 的文件中
keytool export alias mykey file MJcer
有了该证书以及已被签名的 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 VSSMillerNewcer
导入认证答复后您也许会要删除使用旧特征名的初始密钥项
keytool delete alias sMiller
将认证后的CA根证书导入密钥库以便于用这个公钥证书来进行认证签名其它的证书
keytool import trustcacerts alias zhky keystore tujks file xtlcer