您的位置:首页 > 其它

keytool用法

2014-07-02 09:26 85 查看
JDK里面自带了一个密钥生成工具keytool,可以通过它生成SSL 通信需要的密钥对,或者生成自签名的证书。所有密钥对或者签名证书都是存放在“keystore”密钥仓库中,由它来管理。

下面结合具体例子说明:(java WEB容器:tomcat 5.0)

1,生成服务端密钥仓库,

keytool -genkey -alias svrkey -keyalg RSA -keystore d:/svr.jks -validity 365

"alias"是生成的密钥别名,密钥的导入导出都需要由别名来定位。

"keystore"生成的密钥仓库

"validity"生成密钥仓库的有效期(天)

随后会要求输入密钥仓库入口密码,比如: lostsky_11

输完密码后,接着会要求一系列的输入,无非是单位,所在地区之类的信息,

但是第一项很重要!为输入服务端域名或IP,如: 192.168.1.3或www.591pic.com

必须与服务器域名或IP相同,否则SSL 连接无法建立(这也是SSL 通信验证的一部分)

2,在tomcat_home/conf/server.xml中配置:

找到ssl 通信配置那一段,加入:

keystoreFile="d:/svr.jks" keystorePass="lostsky_11"

服务器启动时会从中寻找用于建立ssl 连接的密钥

3,导出服务端证书

keytool -export -alias svrkey -file d:/svr.cer -keystore d:/svr.jks

"alias"为想导出的密钥的别名,"file"为导出的证书,"keystore"为存储着导出密钥的仓库

4,生成客户端密钥仓库

keytool -genkey -alias clientkey -keyalg RSA -keystore d:/client.jks

会要求输入仓库密码:如:midsky

5,将服务端证书导入到客户端密钥仓库

keytool -import -file d:/svr.cer -keystore d:/client.jks

会要求输入客户端密钥仓库的密码:如上是:midsky

6,在客户端,每次访问服务端之前,加入

"System.setProperty("javax.net.ssl .trustStore","d://client.jks");

System.setProperty("javax.net.ssl .trustStorePassword","midsky");
"

就把服务端证书添加到了客户端的信任域中,能够完成ssl 通信。

注:ssl 通信主要验证三个方面:

a, 证书是否可信(第6步)

b, 证书是否过期(第1步:validity)

c, 证书地址是否和当前访问地址符合(第1步)

以上是客户端对于服务端的验证,这也是SSL 默认的实现方式。在这种方式下,每次通信时,发起请求方(如PC中的BROWSER)都会验证响应方(如某个WEB服务端)的证书是否在己方信任域中,对 方的证书是否过期,对方的域名或IP,是否与信任域中证书记载的一致;不符合其中任何一项,通信都会被拒绝。但反过来,响应方是不对请求方做任何验证的。 所以有些需要双向验证的服务(比如某些服务只能对特定的拥有证书的用户开放),就需要添加客户端证书,由服务端来验证了,原理和实现与默认模式类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: