这几天被 SSL和证书搞得头昏脑胀的。不过还好终于把这个 SSL搞定了。
用 SSL进行双向身份验证意思就是在客户机连接服务器时, 链接双方都要对彼此的数字证书
进行验证, 保证这是经过授权的才能够连接 (我们链接一般的 SSL时采用的是单向验证, 客
户机只验证服务器的证书, 服务器不验证客户机的证书。 而连接网上银行时使用的 U盾就是
用来存储进行双向验证所需要的客户端证书的)。
JDK里面内置了一个数字证书生产工具: keytool 。但是这个工具只能生成自签名的数字证
书。所谓自签名就是指证书只能保证自己是完整的, 没有经过非法修改的。 但是无法保证这
个证书是属于谁的。其实用这种自签名的证书也是可以进行双向验证的 ( 用 keytool 生成的
自签名证书进行双向验证请看这里,向这位仁兄致意~:
http://www.blogjava.net/stone2083/archive/2007/12/20/169015.html ),但是这种验证
有一个缺点: 对于每一个要链接的服务器, 都要保存一个证书的验证副本。 而且一旦服务器
更换证书, 所有客户端就需要重新部署这些副本。 对于比较大型的应用来说, 这一点是不可
接受的。 所以就需要证书链进行双向认证。 证书链是指对证书的签名又一个预先部署的, 众
所周知的签名方签名完成, 这样每次需要验证证书时只要用这个公用的签名方的公钥进行验
证就可以了。比如我们使用的浏览器就保存了几个常用的 CA_ROOT。每次连接到网站时只要
这个网站的证书是经过这些 CA_ROOT签名过的。就可以通过验证了。
但是这些共用的 CA_ROOT的服务不是免费的。 而且价格不菲。 所以我们有必要自己生成一个
CA_ROOT的密钥对,然后部署应用时,只要把这个 CA_ROOT的私钥部署在所有节点就可以完
成验证了。要进行 CA_ROOT的生成,需要 OpenSSL(http://www.openssl.org/ )。你也可
以在 http://www.slproweb.com/products/Win32OpenSSL.html 找到 Windows 下的版本
安装好 OpenSSL以后就可以生成证书链了,我写了一个 BAT解决这些东西:
@echo off
set C
set PWD_SERVER_KS=serverks
set PWD_SERVER_KEY=serverkey
set PWD_CLIENT_KS=clientks
set PWD_CLIENT_KEY=clientkey
if not exist ca.key (
echo Generating a ca root key file...
openssl req -new -x509 -keyout ca.key -out ca.crt -config %CONFIG%
) else (
echo ca.key already exists...
)