Keytool是用于管理密钥和证书的工具,使用户和管理员能管理自己的公/私钥对以及相关的证书。Keytool主要用于认证服务和使用数字签名验证数据的完整性。J2SE复合包以命令行工具的形式提供Keytool,可用于创建Java密钥库(Java keystore,JKS)和Java加密扩展密钥库(Java Cryptographic Extensions Keystore,JCEKS)、生成并存储密钥及其相关的X.509v1证书、生成证书签发请求(Certificate Signing Requests,CSR)、导入并存储可信证书及维护密钥库项。
keytool工具使用X.509证书标准,而X.509证书标准则使用抽象语法标记1(Abstract Syntax Notation1,ASN.1)标准和明确编码规则(Definite Encoding Rules,DER)标准,其中前者用于描述证书数据,后者用于指定信息如何存储和传输。另外,X.509证书还使用X.500可辨别名称(Distinguished Name,DN)标准来描述持有者和颁发者字段的值。
下面介绍用Keytool工具执行的常见操作。
创建密钥库数据库。使用Keytool向不存在的密钥库添加新项时,将创建一个新的密钥库。当用户目录中没有指定的密钥库时,下列选项将自动创建一个密钥库:
ˉgenkey选项:用于生成公/私钥对。
ˉimport选项:用于导入可信证书。
ˉidentitydb:用于从JDK1.1中导入数据。
默认情况下,Keytool创建扩展名为.keystore的密钥库,并将其存储在用户的主目录中,但是也可以使用选项ˉkeystore来指定文件名。
生成公/私密钥对。使用Keytool生成公/私钥对时,每项都将包括一个私钥和与之相关的证书“链”,证书链中的第一个证书包含与私钥对应的公钥。
要生成公/私钥对并将其添加到密钥库中,可以使用命令keytoolˉgenkey。其中选项ˉgenkey创建公/私钥对,并将公钥封装到一个自签名证书中。下面的范例生成一个密钥对,并将公钥封装到一个X.509自签名证书中,再将该证书存储在一条只有一个元素的证书链上。在该命令中,还需要为密钥和密钥库指定密码、使用的算法(RSA)和别名,如范例3ˉ20所示。
范例3ˉ20 使用keytool生成密钥对
ˉkeyalg:指定密钥使用的加密算法(如RSA)。还可以使用选项keysize指定密钥的长度,如果没有指定长度,那么keytool将使用默认值———1024位。
ˉkeypass:指定生成密钥的密码。
ˉkeystore:指定存储密钥的密钥库的名称(二进制文件),如果没有指定,那么将创建一个新的密钥库,并将其存储为.keystore文件。
ˉstorepass:指定访问密钥库的密码。密钥库创建后,要对其做任何修改都必须提供该密码,以便访问密钥库。
在执行这些命令和选项时,还将提示用户提供下列数据,以创建X.500可辨别名称的子项
范例3ˉ21 使用Keytool生成密钥对
列出密钥库中的项。Keytool选项ˉlist用于列出密钥库中全部的项,以及查看与别名相关的项。范例3ˉ22中的命令列出了名为mykeystore的密钥库中全部的项,该命令还要求用户输入密钥库的密码。
范例3ˉ22 使用keytool列出Java密钥库中的项
范例3ˉ23 使用keytool列出Java密钥库的内容
导入可信证书。Keytool选项ˉimport用于将可信证书导入密钥库,并将其同唯一的一个别名联系起来。如果客户端信任通信等对体的证书,并希望与其进行可信的客户端交互,则可以在客户端环境中导入可信证书。
将新证书导入密钥库时,keytool工具将验证该证书的完整性和真实性。为此,keytool工具将构建一条以该证书开始到颁发者的自签名证书结束的信任链。可信证书的列表将存储在cacerts文件中。
要将证书导入密钥库(参见范例3ˉ25),则需要提供标识证书项的唯一别名和密钥密码。例如,下面的命令从文件mycertificate.cer中将一个证书项导入到密钥库clientkeystore,并将该证书项标识为myclientalias,而密钥和密钥库的密码分别是clientkeypass和clientpass。最后,该命令将显示证书的持有者和颁发者的信息,并询问用户是否信任该证书:范例3ˉ25 向Java密钥库中导入可信证书
范例3ˉ26给出了如何显示一个二进制证书文件的内容。
范例3ˉ26 显示证书内容
范例3ˉ27 创建证书签发请求
修改密钥库的密码。要修改密钥库的密码,可以使用keytool选项ˉstorepasswordˉnew来设置新密码(参见范例3ˉ28)。
范例3ˉ28 修改密钥库的密码