马玉涛是尹相杰母亲吗:webservice与ssl传输

来源:百度文库 编辑:偶看新闻 时间:2024/04/19 13:15:29
第一节 基础知识
        最近要做一个SSL的应用,先后了解了两个命令,一个是keytool,一个是openssl。keytool是JDK得集成环境。只要安装了JDK,基本上都会有(^_^,除非你安装太老的!),我用的1.5。 在安装openssl的时候,花了一段时间。因为在巨人的肩膀上,所以干起事来快许多。

Java代码  
  1. 1   基础知识        
  2.  随 着网上支付的不断发展,人们对信息安全的要求越来越高。因此Netscape公司提出了SSL协议,旨在达到在开放网络(Internet)上安全保密地 传输信息的目的,这种协议在WEB上获得了广泛的应用。 之后IETF(ietf.org)对SSL作了标准化,即RFC2246,并将其称为 TLS(Transport Layer Security),从技术上讲,TLS1.0与SSL3.0的差别非常微小。    
  3.     
  4.  SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议,即采用https://ip:port/的方式来访问。当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换(也称握手协议),从而建立安全连接  。  
  5.   
  6. 2.用到的软件包    
  7. Tomcat 6.0.8    
  8. 用途:Web Server。    
  9. JSSE   (jdk1.4以上版本包含有)  
  10. 用途:用来产生Tocmcat使用的秘钥对(keystore)。    
  11. Openssl   
  12. 用途:用来产生CA证书、签名并生成IE可导入的PKCS#12格式私钥。    
  13. 下载:http://www.openssl.org/    
  14.   
  15. JDK工具KEYTOOL  
  16. -genkey         在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥  
  17. 、私钥和证书  
  18.  -alias          产生别名  
  19.  -keystore       指定密钥库的名称(产生的各类信息将不在.keystore文件中  
  20.  -keyalg         指定密钥的算法      
  21.  -validity       指定创建的证书有效期多少天  
  22.  -keysize        指定密钥长度  
  23.  -storepass      指定密钥库的密码  
  24.  -keypass        指定别名条目的密码  
  25.  -dname         指定证书拥有者信息例如: "CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn"  
  26.  -list           显示密钥库中的证书信息      keytool -list -v -keystore 别名 -storepass ....  
  27.  -v             显示密钥库中的证书详细信息  
  28.  -export     将别名指定的证书导出到文件    keytool -export -alias 别名 -file 文件名.crt  
  29.  -file           参数指定导出到文件的文件名  
  30.  -delete         删除密钥库中某条目          keytool -delete -alias 别名 -keystore sage  
  31.  -keypasswd      修改密钥库中指定条目口令       keytool -keypasswd -alias 别名 -keypass .... -new .... -storepass ... -keystore 别名  
  32.  -import         将已签名数字证书导入密钥库       
  33. keytool -import -alias 别名 -keystore 证书名-file 文件名  
  34. (可以加.crt 后缀)    
  35.  命令:   
  36.  生成证书  
  37.  keytool -genkey -keystore 文件名(可包含路径) -keyalg rsa -alias 别名 -validity 有效期   
  38.  查看证书  
  39.  keytool -list -v -keystore 路径   
  40.  把证书导出到文件  
  41.  keytool -export -alias 别名 -keystore 证书名 -rfc -file 文件名(可包含路径)   
  42.  修改密码  
  43.  keytool -keypasswd -alias 别名 -keypass 旧密码 -new 新密码   
  44.  导出证书到新的TrustStore  
  45.  keytool -import -alias 别名 -file 文件名 -keystore truststore  
  46.   
  47.   
  48.   
  49.             第二节 安装  
  50. 一、下载:  
  51. Openssl版本0.9.8i 地址:http://www.openssl.org/source/openssl-0.9.8i.tar.gz[url]  
  52. ActivePerl版本5.8.8.822 [url]http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-  
  53. 5.8.8.822-MSWin32-x86-280952.msi  
  54.   
  55. 二、安装:  
  56. 编译器VC6机器上一直有,不是这次特意安装的。貌似只要是c++编译器就差不多。  
  57. 1.安装VC和ActivePerl,先后顺序无所谓,安装时注意勾选添加环境变量的选项。  
  58. 2.检查VC6的环境变量,path需要包含C:\Program Files\Microsoft Visual Studio\VC98\bin,没有的话手动添加。测试是否有vc环境最  
  59. 简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报:“'cl' 不是内部或外部命令,也不是可运行的程序  
  60. ”。  
  61. 另外,还有一种办法:可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本的vc这个文件所在位置不同所以我就不说明它的位置了。  
  62.   
  63.   
  64. 3.解压Openssl,解压后会发现openssl-0.9.8i 目录下面有很多文件,更改文件夹名称为openssl,并剪切到c:\openssl其中的一个文件是INSTALL.W32用记事本或者其他文本编辑器 打开,这个文件是介绍Win32平台的安装方法,我下面的批处理也是根据这个文件写的,大家最好依据这文件的描述安装,英文不好的,可以对照我的批处理来 看,如果大家安装的版本和我相同,  
  65. 那么直接使用下面的批处理安装即可。在INSTALL.W32相同目录下新建一个批处理install.bat,内容如下  
  66.   
  67.   
  68. @rem  --prefix 指定安装目录   
  69. perl Configure VC-WIN32 --prefix=C:/openssl  
  70. pause   
  71. call ms\do_ms   
  72. pause   
  73. nmake -f ms\ntdll.mak   
  74. pause   
  75. nmake -f ms\ntdll.mak test   
  76. pause   
  77. nmake -f ms\ntdll.mak install  
  78. pause  
  79. 进入到c:\openssl目录,执行批处理install.bat就可以了  
  80.   
  81.   
  82.                           三、注意事项:  
  83.   
  84.   
  85. 1.安装时间比较长,请耐心等待  
  86. 2.每个步骤间使用了pause暂停,便于观察。每步完成后按任意键继续,注意有没有报错。  
  87. 3. 可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本的vc这个文件所在位置不同 所以我就不说明它的位置了。测试是否有vc环境最简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报'cl' 不是内部或外部命令,也不是可运行的程序  
  88. 4.提示%OSVERSION% is not defined 这个错误的时候可以忽略它没关系  
  89. 5.网上搜索到安装前修改OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,否则cl编译器会报.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated 建议使用_read。因为我使用非常简单的功能所以我没有修改它,需要的朋友可以尝试修改它。  
  90. 6.最终编译结束会在指定安装目录下产生子目录和文件夹:  
  91. Makefile.bak  
  92. MINFO  
  93. inc32  
  94. out32dll  
  95. tmp32dll  
  96. bin  
  97.   
  98.   
  99. 7.环境变量path中加入“C:\openssl\bin”,编辑"C:\openssl\openssl.cnf"文 件,修改CA_default节中的policy = policy_match为policy = policy_anything并把它拷贝到 C:\openssl\ssl。运行cmd,在任意目录下运行openssl,不出错误提示为准。注意:openssl.cnf 显示时,是一个快捷方 式  
  100.   
  101.    
  102.   
  103.   
  104. 四、使用OpenSSL  配置Tomcat 6.x   
  105.   
  106. 先建立工作目录    
  107. mkdir   root  
  108.   
  109. 1.生成CA证书目前不使用第三方权威机构的CA来认证,自己充当CA的角色   
  110. 1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024   
  111. 2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem   
  112. 3.自签署证书 :C:\OpenSSL\apps>openssl   
  113. x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650   
  114. 4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl   
  115. pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12   
  116.   
  117. 2.生成server证书   
  118.   
  119. 1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024   
  120. 2.创建证书请求 :C:\OpenSSL\apps>openssl   
  121. req -new -out server/server-req.csr -key server/server-key.pem   
  122. 3.自签署证书 :C:\OpenSSL\apps>openssl  
  123.  x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey   
  124. server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650   
  125. 4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl   
  126. pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12   
  127.   
  128. 3.生成client证书   
  129.   
  130. 1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024   
  131. 2.创建证书请求 :C:\OpenSSL\apps>openssl   
  132. req -new -out client/client-req.csr -key client/client-key.pem   
  133. 3.自签署证书 :C:\OpenSSL\apps>  
  134. 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   
  135. 4. 将证书导出成浏览器支持的.p12格式 :C:\OpenSSL \apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12   
  136.   
  137. 4.根据root证书生成jks文件  
  138. C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem -keystore root.jks   
  139.   
  140. 5.配置tomcat ssl,修改conf/server.xmltomcat6中多了SSLEnabled="true"属性   
  141. keystorefile, truststorefile设置为你正确的相关路径   
  142.   
  143.    
  144.   
  145. xml 代码  
  146.   
  147. enableLookups="true" disableUploadTimeout="true"  
  148. acceptCount="100" maxThreads="200"  
  149. scheme="https" secure="true" SSLEnabled="true"  
  150.   
  151. clientAuth="true" sslProtocol="TLS"  
  152. keystoreFile="server.p12"         
  153. keystoreType="PKCS12" keystorePass="huawei"   
  154. truststoreFile="root.jks"       
  155. truststoreType="JKS" truststorePass="password"  
  156. />  
  157. (注意原文的的配置文件字母的大小写没区分,导致添加HTTPS失败)  
  158.   
  159.    
  160.   
  161.   
  162. 6.将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)   
  163. root.p12导入至受信任的根证书颁发机构,client.p12导入至个人  
  164.   
  165. 7.访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框   
  166. 8.在jsp中取得符合x.509格式的证书  
  167.   
  168. java 代码  
  169. %         
  170.         //获得certificate chain        
  171.          X509Certificate[] ca=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");        
  172.       if(ca==null)        
  173.        {        
  174.          out.println("No cert info!");        
  175.        } else {        
  176.          String   serial=ca[0].getSerialNumber().toString();        
  177.          String DN=ca[0].getSubjectDN().toString();          
  178.        }        
  179.        %  
  180.    
  181. WebServie调用前先设置JVM密钥属性:  
  182.   
  183.   System.setProperty("javax.net.ssl.trustStore", "D:\\Program Files\\tomcat6.0.26\\root.jks");  
  184.  System.setProperty("javax.net.ssl.trustStorePassword", "password");  
  185.  System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
  186.  System.setProperty("javax.net.ssl.keyStore", "D:\\Program Files\\tomcat6.0.26\\server.p12");  
  187.  System.setProperty("javax.net.ssl.keyStorePassword", "huawei");  
  188.  System.setProperty("javax.net.ssl.keyStoreType","PKCS12");