5 例子
假设你希望创建一个密钥库来管理你的公共/私有密钥对和证书。
5.1. 生成密钥对
首先需要创建一个密钥库,并生成密钥对,使用下面的命令行:
keytool -genkeypair -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US"
-alias business -keypass kpi135 -keystore C:\working\mykeystore
-storepass ab987c -validity 180
(请注意:以上输入必须在同一行命令行中,此处为了易于阅读,使用多行展示)
这行命令创建密钥库的名称为“mykeystore”存储在“C:\working”目录下(假设这个文件事先不存在),密钥库的密码为“ab987c”,生成了一个公钥/私钥密钥对条目,条目的公共名称是“Mark Jones
”,组织单元是“JavaSoft”,组织是“Sun”,代表国家的两个字符“US”,使用默认的DSA密钥算法生成密钥,密钥的长度为1024。
这行命令创建了一个自签名的证书(使用默认的“SHA1withDSA”签名算法),这张证书包含了公钥和可辨别名称等信息,证书的有效期是180天,证书和私钥通过别名“business”关联在一起,保护私钥的密码为“kpi135”。
这条命令可以缩短为如下形式,未指定的选项可以使用默认值,系统会提示你输入所需要的值,
keytool -genkeypair
使用这条命令,系统会创建一个别名为“mykey”的密钥库条目,同时生成新的密钥对和证书,证书的有效期为90天,在用户的工作目录下会生成一个密钥库,密钥库的名称为“.keystore”,系统会提示用户输入可辨别名称的信息、密钥库密码和私钥密码。
5.2. 从证书认证中心声请签名证书
到目前我们已经得到了一个自签名的证书,如果一个被CA签名的证书,将会被更多人信任。要得到这样一个签名,首先生成证书签名请求(CSR),通过以下命令:
keytool -certreq -file MarkJ.csr
该命令生成一个CSR (该条目使用默认的别名“mykey”)并将该请求存放在MarkJ.csr文件中,提交给请求给CA,比如:VeriSign等,CA通常将离线验证申请者,验证通过之后,申请者将收到一个由CA签名的证书,(在某些情况下,CA会返回一个证书链, each one authenticating the public key of the signer of the previous certificate in the chain.)
5.3. 导入CA的证书
你需要使用证书链替换你的自签名证书,在这个证书链中的每一个证书都可以用证书的签名者(证书链中前一个证书)的公钥验证,一直到根CA,三级证书可以使用二级证书的公钥验证,二级证书可以使用根证书公钥验证。
导入来自CA的证书应答之前,你需要一个或者更多“受信任的证书”,在你的密钥库中,或者在“cacerts”密钥库文件中:
1、如果证书应答是一个证书链,你只需要证书链中的顶级证书(这个证书是使用CA的公钥验证根CA证书)。
2、如果证书应答是一个单独的证书,你需要一个发布者的证书(你收到的证书是由这个发布者签名的),如果这个发布者证书不是一个自签名的证书,你需要一个签名者的证书,依此类推,直到一个自签名的CA根证书。
“cacerts”密钥库文件中附带5个VeriSign 根证书,所以你或许不需要导入VeriSign 的证书到你的密钥库中,作为信任的证书。但是如果你从不同的CA声请了一个签名证书,而这个CA的证书没有导入到“cacerts”密钥库中,你需要导入CA的证书,让这个CA的证书成为受信任的证书。
A certificate from a CA is usually either self-signed, or signed by another CA (in which case you also need a certificate authenticating that CA's public key). Suppose company ABC, Inc., is a CA, and you obtain a file named "ABCCA.cer" that is purportedly a self-signed certificate from ABC, authenticating that CA's public key.
在导入一个证书作为信任的证书之前,确保该证书是有效的,先查看一下(使用keytool -printcert命令,或者使用keytool -importcert命令,不带有-noprompt选项),确认所显示的证书指纹符合预期的。你可以给发送证书的人打电话,确认证书的指纹。只有指纹相等的情况,才保证证书没有在运输途中换成别人的(例如,一个攻击者的)证书。如果发生这种攻击,在你导入证书之前,你不检查证书,你最终将信任攻击者已经签名的任何东西。
如果你信任证书的有效性,你可以将它添加到你的密钥库中,通过以下命令:
keytool -importcert -alias abc -file ABCCA.cer
这行命令会在你的密钥库中创建一个受信任的证书条目,这个条目包含了ABCCA.cer文件的数据,该条目的别名为“abc”。
5.4. 导入来自CA的证书应答
一旦你已经导入一个可以使用CA公钥签证签名的CA证书,或者在“cacerts”密钥库有该CA的证书,你就可以导入证书应答,从而取代你的自签名证书,
例如,假设你发送你的证书签名请求到VeriSign,你可以使用下面的命令来导入证书应答,假设返回的证书文件是VSMarkJ.cer:
keytool -importcert -trustcacerts -file VSMarkJ.cer
5.5. 导出证书,证书中的公钥用于验证签名
假如你使jarsigner 工具对java归档(JAR)文件进行了签名,客户端使用这个JAR文件之前,需要认证你对这个JAR文件的签名。
验证签名的一种方式是,导入你公钥证书到客户端的密钥库中,将此公钥证书作为受信任的条目。你可以导出你的证书,并向客户端提供这个证书。例如,你可以使用下面的命令,复制你的证书到一个文件中,将其命名为 MJ.cer ,加入证书条目的别名为“mykey”:
keytool -exportcert -alias mykey -file MJ.cer
将这个证书和JAR签名文件发送给客户端,客户端可以使用jarsigner 工具来验证你的签名。
5.6. 导入密钥库
命令“importkeystore”常常用于将一个密钥库中的所有条目导入到另外一个密钥库,包括密钥和证书。你可以使用这个命令导入不同类型密钥库中的条目,导入目标密钥库中条目,将使用和原来一样的别名和保护密码(保护密码用于保护安全密钥和私钥),当keytool工具从原密钥库读取私钥和安全密钥需要密码时,系统会提示用户输入密码,如果导入到目标密钥库时,遇到别名冲突,系统提示用户输入新的别名,或者直接覆盖现有条目。
例如,可以使用下面的命令,从普通的JKS 类型密钥库key.jks中导入条目到PKCS #11类型的密钥库:
keytool -importkeystore
-srckeystore key.jks -destkeystore NONE
-srcstoretype JKS -deststoretype PKCS11
-srcstorepass changeit -deststorepass topsecret
importkeystore 命令也可以导入单个条目从原密钥库到目标密钥库。这种情况,你需要使用srcalias选项指定将要导出的条目的别名,同时需要使用destalias选项指定导入别名,保护密码也一样,需要使用srckeypass和destkeypass选项,例如:
keytool -importkeystore
-srckeystore key.jks -destkeystore NONE
-srcstoretype JKS -deststoretype PKCS11
-srcstorepass changeit -deststorepass topsecret
-srcalias myprivatekey -destalias myoldprivatekey
-srckeypass oldkeypass -destkeypass mynewkeypass
-noprompt
原文http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html