SSL 通道的搭建
度娘解释:
http://baike.baidu.com/view/16147.htm
运行机制的理解:客户端发起链接请求,应用服务器读取配置的服务器证书,验证客户端提交的证书信息,这里可以clientAuth 属性配置搭建双向SSL或者单向SSL,中间的区别就在于客户端是否有自己的证书,如果没有,那么WebServer只需验证客户端配置根证即可;
搭建了SSL通道,WebApp并没有什么直观的表现,想了解她的变化啊,可以,自己抓包去吧。
不过,WebServer是对明文加密处理后以原传输协议来传输信息,还是仅仅更换了传输协议,从而使得原有的抓包方式获取到的只是乱码,现在还真不清楚。
WebServer 是现成的,那么我们能做的就是配置服务器证书,那就涉及到申请、颁发和部署应用的步骤,哈哈,接下来我要写的内容有点坑爹,甚至颠覆了我原有的理解&(申请,谁发出的?;颁发,那么随意吗?部署,有n种可能,自己慢慢试吧,直到你崩溃)
申请:Keytool 命令,这是jdk中的命令,注意啊,这可是一个exe程序,而非jar文件,更不会是java中的security包里的东西了,这是第一个坑,不禁让人怀疑这个密钥对是Java产生滴聂,还是微软产生的啊,换了xUnix 又该如何……
好吧,不管,干活要紧,keytool 产生密钥对,发出证书请求,创建jks文件,第一阶段也就完成了;
紧跟步骤啊&
需要注意的是,不同版本的jdk中 keytool命令的参数是不同的,在使用时最好先 -help一下,我用的jdk 1.6 其命令为:
首先 获取密钥,建立jks密钥容器:
keytool -genkeypair -alias serverkey -keyalg "RSA" -keysize 1024 -keypass 111111 -dname "CN=localhost,OU=tomy,O=jszx,L=jinan,S=SD,C=CN" -keystore .\ca.jks -storepass 111111
其次,获得公钥请求文件
keytool -certreq -alias serverkey -keypass 111111 -sigalg "SHA1withRSA" -file .\cert.req -keystore .\ca.jks -storepass 111111
颁发,简单,三分钟搞定,呵呵,要不是CA机构,您就慢慢等喝,不急,这不是说咱效率,主要是正式证书的颁发流程较为繁琐而已,最终的技术实现呢,就是利用certreq.req文件签发证书,需要的注意的是这个公钥证书(概念一致,换了一个说法,暂且不表)的DN信息务必与keytool产生keypair时的dname一致(哪位兄台要不介意重新来过的话,可以随意啦)
颁发的证书,还不能直接交由服务器使用的,需要转下格式,变为二进制编码的der证书;
到了部署,导入服务器证书和根证
尤其注意:
根证的导入需要参数 -trustcacerts ;服务器证书的导入需要指定服务器证书的别名,如:例中的server
这里也是一个坑,如果不是根证千万不要用-trustcacerts 参数,否则,您就重来吧
list 之后,jks中就只有两张证书,而不是三张&
最后一步:tomcat server.xml 文件的配置
PS:如果是双向SSL 就需要将clientAuth 配置为true,另,clientAuth还有一个want项,表示单向或双向SSL通道根据情况建立。
成果:
附:web容器大都预留了对SSL支持的接口,所以只需要简单的配置就可以搭建这个环境,我这里倒是有jboss、weblogic的环境,但是现在工作不需要也就没在查看其中的差异,谁 要是有兴趣,可以动手试试。