`
123123ghiwjn
  • 浏览: 24675 次
  • 性别: Icon_minigender_2
  • 来自: 陕西
社区版块
存档分类
最新评论

Tomcat下使用ssl实现双向认证

阅读更多

1  SSL(Server Socket Layer)简介 
在网络上信息在源-宿的传递过程中会经过其它的计算机。一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易的时候有可能被监视,从而导致个人隐私的泄露。由于Internet和Intranet体系结构的原因,总有某些人能够读取并替换用户发出的信息。随着网上支付的不断发展,人们对信息安全的要求越来越高。因此Netscape公司提出了SSL协议,旨在达到在开放网络(Internet)上安全保密地传输信息的目的,这种协议在WEB上获得了广泛的应用。 之后IETF(ietf.org)对SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),从技术上讲,TLS1.0与SSL3.0的差别非常微小。 

2  SSL工作原理 
SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议,即采用https://ip:port/的方式来访问。当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下: 

用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。 
服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。 
客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。 
如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。 
客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。 
客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。 
服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。 
本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。 

3.用到的软件包 
Tomcat 6.0.8 
用途:Web Server。 
JSSE   (jdk1.4以上版本包含有)
用途:用来产生Tocmcat使用的秘钥对(keystore)。 
Openssl 
用途:用来产生CA证书、签名并生成IE可导入的PKCS#12格式私钥。 
下载:http://www.openssl.org/  
 
4  配置Tomcat 4.x 使用SSL 

先建立工作目录 
mkdir   root

1.生成CA证书目前不使用第三方权威机构的CA来认证,自己充当CA的角色
1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey
root/root-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey
root/root-key.pem -out root/root.p12

2.生成server证书

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey
server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey
server/server-key.pem -out server/server.p12

3.生成client证书

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey
client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey
client/client-key.pem -out client/client.p12

4.根据root证书生成jks文件

C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem
-keystore root.jks


5.配置tomcat ssl,修改conf/server.xmltomcat6中多了SSLEnabled="true"属性
keystorefile, truststorefile设置为你正确的相关路径
xml 代码

  1. <connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443"      
  2. sslenabled="true" maxhttpheadersize="8192" maxthreads="150"      
  3. minsparethreads="25" maxsparethreads="75" enablelookups="false"      
  4. disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS"      
  5. clientauth="true" keystorefile="d:/path/bin/x509/server.p12"      
  6. keystoretype="PKCS12" keystorepass="123456" truststorefile="d:/path/bin/x509/root.jks"    
  7. truststoretype="JKS" truststorepass="123456"/>    


6.将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)

root.p12导入至受信任的根证书颁发机构,client.p12导入至个人

7.访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框
8.在jsp中取得符合x.509格式的证书

java 代码
  1. <%      
  2.         //获得certificate chain     
  3.          X509Certificate[] ca=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");     
  4.       if(ca==null)     
  5.        {     
  6.          out.println("No cert info!");     
  7.        } else {     
  8.          String   serial=ca[0].getSerialNumber().toString();     
  9.          String DN=ca[0].getSubjectDN().toString();       
  10.        }     
  11.        %>
分享到:
评论
1 楼 sunyou 2011-04-13  
请问版主root.jks密钥库是如何生成的,如果是单独使用keytool生成的话,与server.p12在密码等其他都对不上。在conf.xml文件中配置后无法找到证书内容。请问你是如何实现这些的???
说明:我已经生成root.p12,root.cer,server.p12,server.cer,client.p12,client.cer。

相关推荐

Global site tag (gtag.js) - Google Analytics