转自: http://hi.baidu.com/%D3%C0%B2%BB%D1%D4%C6%FA%B7%E8%D7%D3/blog/item/d669e5d4a00520cd50da4b70.html
简介
Java 自带的 keytool 工具是个密钥和证书管理工具。它使用户能够管理自己的公钥 / 私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户 / 服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。
keystore
是一个密码保护的文件,用来存储密钥和证书(也就是说, keystore 中存储的有两类型 entries );这个文件(默认的)位于你的 home 目录,也就是你登录到操作系统的用户名的那个目录。或者通过 -keystore 参数设为你指定的位置。需要说明的是:如果不通过 -keystore 来指定位置,将使用 home 目录中的默认 keystore 文件。
重要: JDK\jre\lib\security 目录下面有一个 cacerts 的文件,就是一个 keystore ,其默认密码是 changeit 。如果一个 App Server 想建立一个安全的链接到另外一个 Server, 需要通过一个受信的数字证书,而这个证书就需要存储在 cacerts 中。
keytool
用来 import, export, list keystore 中内容的工具,还可以用来以测试为目的,生成自己签署的证书。
keytool 将密钥和证书储存在一个所谓的密钥仓库( keystore )中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。
Java KeyStore 的类型
JKS 和 JCEKS 是 Java 密钥库 (KeyStore) 的两种比较常见类型 ( 我所知道的共有 5 种, JKS, JCEKS, PKCS12, BKS , UBER) 。
证书导入
Der/Cer 证书导入:
要从某个文件中导入某个证书,使用 keytool 工具的 -import 命令:
keytool -import -file mycert.der -keystore mykeystore.jks
如果在 -keystore 选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建。
如果不指定 -keystore 选项,则缺省密钥仓库将是宿主目录中名为 .keystore 的文件。如果该文件并不存在,则它将被创建。
创建密钥仓库时会要求输入访问口令,以后需要使用此口令来访问。可使用 -list 命令来查看密钥仓库里的内容:
keytool -list -rfc -keystore mykeystore.jks
P12 格式证书导入:
keytool 无法直接导入 PKCS12 文件。
第一种方法是使用 IE 将 pfx 证书导入,再导出为 cert 格式文件。使用上面介绍的方法将其导入到密钥仓库中。这样的话仓库里面只包含了证书信息,没有私钥内容。
第二种方法是将 pfx 文件导入到 IE 浏览器中,再导出为 pfx 文件。新生成的 pfx 不能被导入到 keystore 中,报错: keytool 错误: java.lang.Exception: 所输入的不是一个 X.509 认证。新生成的 pfx 文件可以被当作 keystore 使用。但会报个错误 as unknown attr1.3.6.1.4.1.311.17.1, 查了下资料 , 说 IE 导出的就会这样 , 使用 Netscape 就不会有这个错误 .
第三种方法是将 pfx 文件当作一个 keystore 使用。但是通过微软的证书管理控制台生成的 pfx 文件不能直接使用。 keytool 不认此格式,报 keytool 错误: java.io.IOException: failed to decrypt safe contents entry 。需要通过 OpenSSL 转换一下:
1 ) openssl pkcs12 -in mycerts.pfx -out mycerts.pem
2 ) openssl pkcs12 -export -in mycerts.pem -out mykeystore.p12
通过 keytool 的 -list 命令可检查下密钥仓库中的内容:
keytool -rfc -list -keystore mykeystore.p12 -storetype pkcs12
这里需要指明仓库类型为 pkcs12 ,因为缺省的类型为 jks 。这样此密钥仓库就即包含证书信息也包含私钥信息。
P7B 格式证书导入:
keytool 无法直接导入 p7b 文件。
需要将证书链 RootServer.p7b (包含根证书)导出为根 rootca.cer 和子 rootcaserver.cer 。
将这两个证书导入到可信任的密钥仓库中。
keytool -import -alias rootca -trustcacerts -file rootca.cer -keystore testkeytrust.jks
遇到是否信任该证书提示时,输入 y
keytool -import -alias rootcaserver -trustcacerts -file rootcaserver.cer -keystore testkeytrust.jks
总结 :
1)P12 格式的证书是不能使用 keytool 工具导入到 keystore 中的
2)The Sun's PKCS12 Keystore 对从 IE 和其他的 windows 程序生成的 pfx 格式的证书支持不太好 .
3)P7B 证书链不能直接导入到 keystore ,需要将里面的证书导出成 cer 格式,再分别导入到 keystore 。