下面结合具体例子说明:(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,是否与信任域中证书记载的一致;不符合其中任何一项,通信都会被拒绝。但反过来,响应方是不对请求方做任何验证的。 所以有些需要双向验证的服务(比如某些服务只能对特定的拥有证书的用户开放),就需要添加客户端证书,由服务端来验证了,原理和实现与默认模式类似。