﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-HTTPS</title><link>http://www.blogjava.net/stevenjohn/category/52693.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Sun, 10 May 2015 23:15:39 GMT</lastBuildDate><pubDate>Sun, 10 May 2015 23:15:39 GMT</pubDate><ttl>60</ttl><item><title>Http Https Webservice</title><link>http://www.blogjava.net/stevenjohn/archive/2015/05/10/424974.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 10 May 2015 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/05/10/424974.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424974.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/05/10/424974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424974.html</trackback:ping><description><![CDATA[<p>1.Http作为web服务的首选协议，居有4大优点：<br />&nbsp;&nbsp; 1）http非常简单，以纯文本(超文本)形式编码的请求和响应组成<br />&nbsp;&nbsp;  2）http是无状态的。一旦发送了一个http请求，客户和服务器之间的连接信息就会被释放，有利于减少服务器资源的消耗。<br />&nbsp;&nbsp;  3）http的运行端口80，在大多数防火墙上是公开的<br />&nbsp;&nbsp; 4）行业认可。<br />&nbsp; 但是Http的缺点：<br />&nbsp;&nbsp;  1）缺少对异步消息的支持<br />&nbsp;&nbsp; 2）消息传输的不可靠性<br /><br /></p><h3 style="margin: 0px; padding: 0px; color: #333333; font-family: 微软雅黑, Arial, sans-serif; line-height: 24px; background-color: #ffffff;">web service相对http (post/get)有好处吗？</h3><p>&nbsp;</p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px; line-height: 25px; color: #333333; font-family: 微软雅黑, Arial, sans-serif; background-color: #ffffff;">1.接口中实现的方法和要求参数一目了然</p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px; line-height: 25px; color: #333333; font-family: 微软雅黑, Arial, sans-serif; background-color: #ffffff;">2.不用担心大小写问题</p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px; line-height: 25px; color: #333333; font-family: 微软雅黑, Arial, sans-serif; background-color: #ffffff;">3.不用担心中文urlencode问题</p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px; line-height: 25px; color: #333333; font-family: 微软雅黑, Arial, sans-serif; background-color: #ffffff;">4.代码中不用多次声明认证(账号,密码)参数</p><span style="color: #333333; font-family: 微软雅黑, Arial, sans-serif; line-height: 25px; background-color: #ffffff;">5.传递参数可以为数组，对象等...<br /><br /></span>http和webservice的区别：<br />1、http是采用get，post等方式传输数据，而webservice是采用xml格式打包数据，传输是基于http协议进行传输。<br />2、http直接传输数据，而webservice是采用xml编解码数据，所以能速度上面有些慢。<br />3、webservice可以直接传输数组或者对象的数据格式，实际现在常用的http+json也可以的，只是需要进行字符串和各种格式的转换。<br />4、http传输占用的带宽要比webservice占用的带宽少。<br />5、webservice支持用户权限的验证，而http不支持直接的用户权限验证。<br />6、webservice<span style="color: #333333; font-family: 微软雅黑, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff;">接口中实现的方法和要求参数一目了然。<br /></span><br /><br />HTTPS和HTTP的区别：<br />https协议需要到ca申请证书，一般免费证书很少，需要交费。<br />http是超文本传输协议，信息是明文传输，https  则是具有安全性的ssl加密传输协议<br />http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。<br />http的连接很简单,是无状态的<br />HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议  要比http协议安全<br /><br /><br /><p>SSL协议基础</p> <p>SSL协议位于TCP/IP协议与各种应用层协议之间，本身又分为两层：</p> <p>SSL记录协议(SSL Record Protocol)：建立在可靠传输层协议(TCP)之上，为上层协议提供数据封装、压缩、加密等基本功能。</p> <p>SSL握手协议(SSL Handshake  Procotol)：在SSL记录协议之上，用于实际数据传输前，通讯双方进行身份认证、协商加密算法、交换加密密钥等。</p><br /><div>HTTPS通信过程：</div><div>1.在服务器端存在一个公钥及私钥</div><div>2.客户端从服务器取得这个公钥</div><div>3.客户端产生一个随机的密钥</div><div>4.客户端通过公钥对密钥加密（非对称加密）</div><div>5.客户端发送到服务器端</div><div>6.服务器端接受这个密钥并且以后的服务器端和客户端的数据全部通过这个密钥加密（对称加密）</div><div></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/424974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-05-10 11:27 <a href="http://www.blogjava.net/stevenjohn/archive/2015/05/10/424974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> web.xml中配置http访问转向https</title><link>http://www.blogjava.net/stevenjohn/archive/2013/01/06/393883.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 06 Jan 2013 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/01/06/393883.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/393883.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/06/393883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/393883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/393883.html</trackback:ping><description><![CDATA[<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(54,46,43); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong>1.tomcat下所有应用都强制https访问</strong></p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(54,46,43); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">在tomcat\conf\web.xml中的&lt;/welcome-file-list&gt;后面加上以下配置:</p><br />&nbsp; &lt;login-config&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Authorization setting for SSL --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;auth-method&gt;CLIENT-CERT&lt;/auth-method&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;realm-name&gt;Client Cert Users-only Area&lt;/realm-name&gt;<br />&nbsp; &lt;/login-config&gt;<br />&nbsp; &lt;security-constraint&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Authorization setting for SSL --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-resource-collection &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-resource-name &gt;SSL&lt;/web-resource-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/web-resource-collection&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user-data-constraint&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/user-data-constraint&gt;<br />&nbsp; &lt;/security-constraint&gt;<br /><br /><br /><br /><br /><br />
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(54,46,43); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">2.单个应用强制https访问</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(54,46,43); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">WEB-INF/web.xml的&lt;/welcome-file-list&gt;后面加上以下配置:</p>&nbsp; &lt;login-config&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Authorization setting for SSL --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;auth-method&gt;CLIENT-CERT&lt;/auth-method&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;realm-name&gt;Client Cert Users-only Area&lt;/realm-name&gt;<br />&nbsp; &lt;/login-config&gt;<br />&nbsp; &lt;security-constraint&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Authorization setting for SSL --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-resource-collection &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-resource-name &gt;SSL&lt;/web-resource-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/web-resource-collection&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user-data-constraint&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/user-data-constraint&gt;<br />&nbsp; &lt;/security-constraint&gt;<br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/393883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-06 21:28 <a href="http://www.blogjava.net/stevenjohn/archive/2013/01/06/393883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient 实现跳转请求</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388733.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 27 Sep 2012 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388733.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/388733.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/388733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/388733.html</trackback:ping><description><![CDATA[实现servlet的跳转，以输入流的形式来传输数据<br /><br />测试UnionPayServlet的httpClient测试类：<br />&nbsp;&nbsp;package com.abin.lee.https;<div></div><div>import java.io.IOException;</div><div>import java.io.OutputStream;</div><div>import java.io.OutputStreamWriter;</div><div>import java.io.Writer;</div><div></div><div>import junit.framework.TestCase;</div><div></div><div>import org.apache.http.HttpEntity;</div><div>import org.apache.http.HttpResponse;</div><div>import org.apache.http.client.HttpClient;</div><div>import org.apache.http.client.methods.HttpPost;</div><div>import org.apache.http.entity.ContentProducer;</div><div>import org.apache.http.entity.EntityTemplate;</div><div>import org.apache.http.impl.client.DefaultHttpClient;</div><div>import org.apache.http.util.EntityUtils;</div><div>import org.junit.Test;</div><div></div><div>public class HttpClientTest extends TestCase {</div><div></div><div><span style="white-space:pre">	</span>private static final String Url = "http://localhost:9090/Spa/UnionPayServlet";</div><div></div><div><span style="white-space:pre">	</span>@Test</div><div><span style="white-space:pre">	</span>public void testHttpClient() throws Exception {</div><div><span style="white-space:pre">		</span>HttpClient client = new DefaultHttpClient();</div><div><span style="white-space:pre">		</span>HttpPost post = new HttpPost(Url);</div><div><span style="white-space:pre">		</span>ContentProducer create = new ContentProducer() {</div><div><span style="white-space:pre">			</span>public void writeTo(OutputStream outstream) throws IOException {</div><div><span style="white-space:pre">				</span>Writer writer = new OutputStreamWriter(outstream, "UTF-8");</div><div><span style="white-space:pre">				</span>writer.write("start");</div><div><span style="white-space:pre">				</span>writer.flush();</div><div><span style="white-space:pre">				</span>writer.close();</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>};</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>HttpEntity request = new EntityTemplate(create);</div><div><span style="white-space:pre">		</span>post.setEntity(request);</div><div></div><div><span style="white-space:pre">		</span>HttpResponse response = client.execute(post);</div><div><span style="white-space:pre">		</span>HttpEntity entity = response.getEntity();</div><div><span style="white-space:pre">		</span>String result = EntityUtils.toString(entity);</div><div><span style="white-space:pre">		</span>System.out.println("the last message is: "+result);</div><div><span style="white-space:pre">	</span>}</div><div></div><div>}</div><div></div><br /><br /><br />//被访问的servlet，也就是中间servlet<br /><div><div>package org.litsoft.air.servlet;</div><div></div><div>import java.io.BufferedReader;</div><div>import java.io.BufferedWriter;</div><div>import java.io.IOException;</div><div>import java.io.InputStreamReader;</div><div>import java.io.OutputStream;</div><div>import java.io.OutputStreamWriter;</div><div>import java.io.Writer;</div><div></div><div>import javax.servlet.ServletException;</div><div>import javax.servlet.ServletOutputStream;</div><div>import javax.servlet.http.HttpServlet;</div><div>import javax.servlet.http.HttpServletRequest;</div><div>import javax.servlet.http.HttpServletResponse;</div><div></div><div>import org.apache.http.HttpEntity;</div><div>import org.apache.http.HttpResponse;</div><div>import org.apache.http.client.HttpClient;</div><div>import org.apache.http.client.methods.HttpPost;</div><div>import org.apache.http.entity.ContentProducer;</div><div>import org.apache.http.entity.EntityTemplate;</div><div>import org.apache.http.impl.client.DefaultHttpClient;</div><div>import org.apache.http.util.EntityUtils;</div><div></div><div>public class UnionPayServlet extends HttpServlet {</div><div><span style="white-space:pre">	</span>private static final String Url = "http://localhost:9090/Spa/changeServlet";</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>protected void doPost(HttpServletRequest request, HttpServletResponse response)</div><div><span style="white-space:pre">			</span>throws ServletException, IOException {</div><div><span style="white-space:pre">		</span>System.out.println("UnionPayServlet");</div><div><span style="white-space:pre">		</span>String result=null;</div><div><span style="white-space:pre">		</span>BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));</div><div><span style="white-space:pre">		</span>int num=0;</div><div><span style="white-space:pre">		</span>char[] buffer=new char[1024];</div><div><span style="white-space:pre">		</span>while((num=reader.read(buffer))!=-1){</div><div><span style="white-space:pre">			</span>result=new String(buffer,0,num);</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span>System.out.println("from HttpCLient message is: ="+result);</div><div><span style="white-space:pre">		</span>final String transfer=result;</div><div><span style="white-space:pre">		</span>HttpClient client = new DefaultHttpClient();</div><div><span style="white-space:pre">		</span>HttpPost post = new HttpPost(Url);</div><div><span style="white-space:pre">		</span>ContentProducer create = new ContentProducer() {</div><div><span style="white-space:pre">			</span>public void writeTo(OutputStream outstream) throws IOException {</div><div><span style="white-space:pre">				</span>Writer writer = new OutputStreamWriter(outstream, "UTF-8");</div><div><span style="white-space:pre">				</span>writer.write(transfer);</div><div><span style="white-space:pre">				</span>writer.flush();</div><div><span style="white-space:pre">				</span>writer.close();</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>};</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>HttpEntity httpEntity = new EntityTemplate(create);</div><div><span style="white-space:pre">		</span>post.setEntity(httpEntity);</div><div><span style="white-space:pre">		</span>HttpResponse httpResponse = client.execute(post);</div><div><span style="white-space:pre">		</span>HttpEntity entity = httpResponse.getEntity();</div><div><span style="white-space:pre">		</span>String result1 = EntityUtils.toString(entity);</div><div>//<span style="white-space:pre">		</span>System.out.println(result1);</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>ServletOutputStream out=response.getOutputStream();</div><div><span style="white-space:pre">		</span>BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));</div><div><span style="white-space:pre">		</span>writer.write("this message is received by UnionPayServlet is: "+result1);</div><div><span style="white-space:pre">		</span>writer.flush();</div><div><span style="white-space:pre">		</span>writer.close();</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public void destroy() {</div><div><span style="white-space:pre">		</span>super.destroy();</div><div><span style="white-space:pre">	</span>}</div><div>}</div><div><br /><br /><br /><br />//最终要处理的servlet<br /><div>package org.litsoft.air.servlet;</div><div></div><div>import java.io.BufferedReader;</div><div>import java.io.BufferedWriter;</div><div>import java.io.IOException;</div><div>import java.io.InputStreamReader;</div><div>import java.io.OutputStreamWriter;</div><div>import java.io.PrintWriter;</div><div>import java.net.HttpURLConnection;</div><div>import java.net.URL;</div><div></div><div>import javax.servlet.ServletException;</div><div>import javax.servlet.ServletOutputStream;</div><div>import javax.servlet.http.HttpServlet;</div><div>import javax.servlet.http.HttpServletRequest;</div><div>import javax.servlet.http.HttpServletResponse;</div><div></div><div>import org.litsoft.air.unionpay.CreateJdomOne;</div><div></div><div>public class ChangeServlet extends HttpServlet {</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>protected void doPost(HttpServletRequest request,</div><div><span style="white-space:pre">			</span>HttpServletResponse response) throws ServletException, IOException {</div><div></div><div><span style="white-space:pre">		</span>// 接收Servlet传回来的信息</div><div><span style="white-space:pre">		</span>BufferedReader reader = new BufferedReader(new InputStreamReader(</div><div><span style="white-space:pre">				</span>request.getInputStream()));</div><div><span style="white-space:pre">		</span>String show = null;</div><div><span style="white-space:pre">		</span>StringBuffer stb = new StringBuffer();</div><div><span style="white-space:pre">		</span>while ((show = reader.readLine()) != null) {</div><div><span style="white-space:pre">			</span>stb.append(show);</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span>System.out.println("from UnionPayServlet message is :" + stb.toString());</div><div><span style="white-space:pre">		</span>reader.close();</div><div><span style="white-space:pre">		</span>ServletOutputStream out=response.getOutputStream();</div><div><span style="white-space:pre">		</span>BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));</div><div><span style="white-space:pre">		</span>writer.write("this message is received by ChangeServlet is :"+stb.toString());</div><div><span style="white-space:pre">		</span>writer.flush();</div><div><span style="white-space:pre">		</span>writer.close();</div><div></div><div><span style="white-space:pre">	</span>}</div><div>}</div><div></div><br /><br />//servlet的配置<br /><div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div><div>&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"</div><div><span style="white-space:pre">	</span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</div><div><span style="white-space:pre">	</span>xsi:schemaLocation="http://java.sun.com/xml/ns/javaee&nbsp;</div><div><span style="white-space:pre">	</span>http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;</div><div></div><div></div><div><span style="white-space:pre">	</span>&lt;servlet&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;UnionPayServlet&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-class&gt;org.litsoft.air.servlet.UnionPayServlet&lt;/servlet-class&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet&gt;</div><div><span style="white-space:pre">	</span>&lt;servlet-mapping&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;UnionPayServlet&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;url-pattern&gt;/UnionPayServlet&lt;/url-pattern&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet-mapping&gt;</div><div></div><div></div><div><span style="white-space:pre">	</span>&lt;servlet&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;changeServlet&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-class&gt;org.litsoft.air.servlet.ChangeServlet&lt;/servlet-class&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet&gt;</div><div><span style="white-space:pre">	</span>&lt;servlet-mapping&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;changeServlet&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;url-pattern&gt;/changeServlet&lt;/url-pattern&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet-mapping&gt;</div><div></div><div><span style="white-space:pre">	</span>&lt;welcome-file-list&gt;</div><div><span style="white-space:pre">		</span>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;</div><div><span style="white-space:pre">	</span>&lt;/welcome-file-list&gt;</div><div>&lt;/web-app&gt;</div><div></div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/388733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-27 20:31 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/27/388733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpsUrlConnection   https双向验证</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388647.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 26 Sep 2012 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388647.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/388647.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/388647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/388647.html</trackback:ping><description><![CDATA[以下文章都是整合了好多网上的好多朋友的优秀资源，才写出来的。具体参考过谁的，我也记不清楚了。关于怎么生成https双向的证书，地址在这里：<br /><a href="http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html">http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html</a>&nbsp;<br />应该正常来说，按照这个教程做的话是没有任何问题的，但是也有些朋友出过问题，主要问题是在，把证书导入到浏览器里面的时候出的，注意这里。<br /><br />我这里面的我都做过三四次了，基本没啥问题。但也不排除不会不出问题。<br /><br />由于网上关于httpCilent来测试调用HTTPS的例子较少，经过在度娘和谷爹的查找，总算是也找到了一篇文章，参考以后，做出来一个测试类，在我机器上面是能够跑通的。具体地址：<a href="http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html">http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html</a>&nbsp;<br /><br /><br /><br />//首先说一下，这个是我随便写的一个发布到tomcat的httpsUrlConnection的Servlet服务，主要是用来测试一下https双向验证的，现在网上好多的文章都是https单向验证的Java代码，我在网上看过好多，但是好多都是半成品，然后总结了一下，在自己的机器上面是完全能够跑通的，在这里做个笔记，以后用得着的时候来拿：<br /><div>package com.abin.lee.https;</div><div></div><div>import java.io.BufferedReader;</div><div>import java.io.IOException;</div><div>import java.io.InputStreamReader;</div><div>import java.io.PrintWriter;</div><div>import java.util.Enumeration;</div><div>import java.util.Map;</div><div></div><div>import javax.servlet.ServletException;</div><div>import javax.servlet.ServletOutputStream;</div><div>import javax.servlet.http.HttpServlet;</div><div>import javax.servlet.http.HttpServletRequest;</div><div>import javax.servlet.http.HttpServletResponse;</div><div></div><div>@SuppressWarnings("serial")</div><div>public class ReceiveHttpsUrlConnectionRequest extends HttpServlet {</div><div><span style="white-space:pre">	</span>public void service(HttpServletRequest request, HttpServletResponse response)</div><div><span style="white-space:pre">			</span>throws ServletException, IOException {</div><div><span style="white-space:pre">		</span>System.out.println("receive https request");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**这个主要是接收，由对方给以POST形式发过来的内容，这种内容不是以key-value的形式发的，而是直接通过Java的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*string content="test https double auth";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *BufferedWriter writer &nbsp;= new BufferedWriter();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *writer.writer(content.getBytes());<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *通过这种形式发过来的内容的接收，由于直接放到request里面发送过来的，所以的从request里面来接收。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*之前做银联的手机支付的时候也是这么传递参数的。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</div><div><span style="white-space:pre">		</span>BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));</div><div><span style="white-space:pre">		</span>String line=null;</div><div><span style="white-space:pre">		</span>StringBuffer stb=new StringBuffer();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //循环的一行一行的读取内容<br />&nbsp; &nbsp;&nbsp;<span style="white-space: pre; ">		</span>while((line=reader.readLine())!=null){</div><div><span style="white-space:pre">			</span>stb.append(line);</div><div><span style="white-space:pre">		</span>}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //打印读取到的内容。</div><div><span style="white-space:pre">		</span>System.out.println("stb="+stb.toString());<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //给调用者返回内容</div><div><span style="white-space:pre">		</span>PrintWriter write=response.getWriter();</div><div><span style="white-space:pre">		</span>write.write("receive HttpsUrlConnection success");</div><div><span style="white-space:pre">		</span>write.flush();</div><div><span style="white-space:pre">		</span>write.close();</div><div><span style="white-space:pre">	</span>}</div><div>}</div><div><br /><br /><br /><br />//这个是在web工程里面的web.xml里面配置的发布的servlet服务<br />//web.xml<br /><div>&lt;servlet&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;httpsUrlConnectionRequest&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-class&gt;com.abin.lee.https.ReceiveHttpsUrlConnectionRequest&lt;/servlet-class&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet&gt;</div><div><span style="white-space:pre">	</span>&lt;servlet-mapping&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;httpsUrlConnectionRequest&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;url-pattern&gt;/httpsUrlConnectionRequest&lt;/url-pattern&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet-mapping&gt;</div><br />//HttpsUrlConnection测试类<br /><div>package com.abin.lee.test;</div><div></div><div>import java.io.BufferedReader;</div><div>import java.io.IOException;</div><div>import java.io.InputStreamReader;</div><div>import java.io.OutputStream;</div><div>import java.net.URL;</div><div>import java.util.Date;</div><div></div><div>import javax.net.ssl.HostnameVerifier;</div><div>import javax.net.ssl.HttpsURLConnection;</div><div>import javax.net.ssl.SSLSession;</div><div></div><div>import junit.framework.TestCase;</div><div></div><div>import org.junit.Before;</div><div>import org.junit.Test;</div><div></div><div>public class HttpsUrlConnectionClient extends TestCase {</div><div><span style="white-space:pre">	</span>// 客户端密钥库</div><div><span style="white-space:pre">	</span>private String sslKeyStorePath;</div><div><span style="white-space:pre">	</span>private String sslKeyStorePassword;</div><div><span style="white-space:pre">	</span>private String sslKeyStoreType;</div><div><span style="white-space:pre">	</span>// 客户端信任的证书</div><div><span style="white-space:pre">	</span>private String sslTrustStore;</div><div><span style="white-space:pre">	</span>private String sslTrustStorePassword;<br />&nbsp; &nbsp; &nbsp; &nbsp; //上面发布的servlet请求地址</div><div><span style="white-space:pre">	</span>private String httpsUrlConnectionUrl = "https://localhost:8443/global/httpsUrlConnectionRequest";</div><div></div><div><span style="white-space:pre">	</span>@Before</div><div><span style="white-space:pre">	</span>public void setUp() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //这是密钥库<br />&nbsp; &nbsp;&nbsp;<span style="white-space: pre; ">		</span>sslKeyStorePath = "D:\\home\\tomcat.keystore";</div><div><span style="white-space:pre">		</span>sslKeyStorePassword = "stevenjohn";</div><div><span style="white-space:pre">		</span>sslKeyStoreType = "JKS"; // 密钥库类型，有JKS PKCS12等<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //信任库，这里需要服务端来新人客户端才能调用，因为这个我是配置的https双向验证，不但是要客户端信任服务端，服务端也要信任客户端。</div><div><span style="white-space:pre">		</span>sslTrustStore = "D:\\home\\tomcat.keystore";</div><div><span style="white-space:pre">		</span>sslTrustStorePassword = "stevenjohn";</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStorePassword",</div><div><span style="white-space:pre">				</span>sslKeyStorePassword);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);</div><div><span style="white-space:pre">		</span>// 设置系统参数</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.trustStore", sslTrustStore);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.trustStorePassword",</div><div><span style="white-space:pre">				</span>sslTrustStorePassword);</div><div><span style="white-space:pre">		</span>System.setProperty("java.protocol.handler.pkgs", "sun.net.www.protocol");</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Test</div><div><span style="white-space:pre">	</span>public void testHttpsUrlConnectionClient() {</div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span>URL url = new URL(httpsUrlConnectionUrl);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //对于主机名的验证，因为配置服务器端的tomcat.keystore的证书的时候，是需要填写用户名的，一般用户名来说是本地ip地址，或者本地配置的域名<br />&nbsp; &nbsp;&nbsp;<span style="white-space: pre; ">			</span>HostnameVerifier hv = new HostnameVerifier() {</div><div><span style="white-space:pre">				</span>public boolean verify(String urlHostName, SSLSession session) {</div><div><span style="white-space:pre">					</span>return true;</div><div><span style="white-space:pre">				</span>}</div><div><span style="white-space:pre">			</span>};</div><div><span style="white-space:pre">			</span>HttpsURLConnection.setDefaultHostnameVerifier(hv);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //编写HttpsURLConnection 的请求对象，这里需要注意HttpsURLConnection 比我们平时用的HttpURLConnection对了一个s，因为https是也是遵循http协议的，并且是采用ssl这个安全套接字来传输信息的，但是也有可能遭到黑客的攻击 &nbsp;</div><div><span style="white-space:pre">			</span>HttpsURLConnection connection = (HttpsURLConnection) url</div><div><span style="white-space:pre">					</span>.openConnection();</div><div><span style="white-space:pre">			</span>connection.setRequestProperty("Content-Type", "text/xml");</div><div><span style="white-space:pre">			</span>connection.setDoOutput(true);</div><div><span style="white-space:pre">			</span>connection.setDoInput(true);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //设置请求方式为post,这里面当然也可以用get，但是我这里必须用post<br />&nbsp; &nbsp;&nbsp;<span style="white-space: pre; ">			</span>connection.setRequestMethod("POST");</div><div><span style="white-space:pre">			</span>connection.setUseCaches(false);</div><div><span style="white-space:pre">			</span>connection.setReadTimeout(30000);</div><div><span style="white-space:pre">			</span>String user="abin";</div><div><span style="white-space:pre">			</span>String pwd="abing";</div><div><span style="white-space:pre">			</span>String request="user="+user+"&amp;pwd="+pwd;</div><div><span style="white-space:pre">			</span>OutputStream out = connection.getOutputStream();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //下面的这句话是给servlet发送请求内容</div><div><span style="white-space:pre">			</span>out.write(request.getBytes());</div><div><span style="white-space:pre">			</span>out.flush();</div><div><span style="white-space:pre">			</span>out.close();</div><div><span style="white-space:pre">			</span></div><div><span style="white-space:pre">			</span>//接收请求的返回值</div><div><span style="white-space:pre">			</span>BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));</div><div><span style="white-space:pre">			</span>StringBuffer stb = new StringBuffer();</div><div><span style="white-space:pre">			</span>String line;</div><div><span style="white-space:pre">			</span>while ((line = reader.readLine()) != null) {</div><div><span style="white-space:pre">				</span>stb.append(line);</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">			</span>Integer statusCode = connection.getResponseCode();</div><div><span style="white-space:pre">			</span>System.out.println("返回状态码:" + statusCode);</div><div><span style="white-space:pre">			</span>reader.close();</div><div><span style="white-space:pre">			</span>connection.disconnect();</div><div><span style="white-space:pre">		</span>} catch (IOException e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">	</span>}</div><div></div><div>}</div><div></div><br /><br /><br /><br />//发布好了服务，你需要在tomcat里面配置好了https服务的端口才能使用。<br />//tomcat配置文件：<br /><div>&nbsp;&lt;Connector port="6060" protocol="HTTP/1.1"&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connectionTimeout="20000"&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;redirectPort="8443" /&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; /**关于https端口的说明，银联一般用的都是0--9 &nbsp;443,这种类型的端口，第一位是0--9中的任意一位，然后后面三位是443，而通过我的测试，发觉随便一个端口号都可 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * &nbsp; 以的，只要不和你机器的其他端口冲突就行，911,95553这些端口都是可以滴。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *clientAuth="true" &nbsp; 这里设置为false是https单向认证，设置为true则是https双向认证<br />&nbsp; &nbsp; &nbsp; &nbsp; */</div><div></div><div><span style="white-space:pre">	</span>&lt;Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"</div><div><span style="white-space:pre">			</span> &nbsp; SSLEnabled="true" maxThreads="150" scheme="https"</div><div><span style="white-space:pre">			</span> &nbsp; secure="true" clientAuth="true" sslProtocol="TLS"</div><div><span style="white-space:pre">			</span> &nbsp; keystoreFile="D:\\home\\tomcat.keystore" keystorePass="stevenjohn" &nbsp;//密钥库</div><div><span style="white-space:pre">			</span> &nbsp; truststoreFile="D:\\home\\tomcat.keystore" truststorePass="stevenjohn" /&gt;//信任库</div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/388647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-27 00:16 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/27/388647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient https双向验证</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 26 Sep 2012 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/388646.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/388646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/388646.html</trackback:ping><description><![CDATA[已经发布的准备要测试的https服务：<br /><div>package com.abin.lee.https;</div><div></div><div>import java.io.IOException;</div><div>import java.io.PrintWriter;</div><div>import java.util.Map;</div><div></div><div>import javax.servlet.ServletException;</div><div>import javax.servlet.http.HttpServlet;</div><div>import javax.servlet.http.HttpServletRequest;</div><div>import javax.servlet.http.HttpServletResponse;</div><div></div><div>@SuppressWarnings("serial")</div><div>public class ReceiveHttpClientRequest extends HttpServlet {</div><div><span style="white-space:pre">	</span>public void service(HttpServletRequest request, HttpServletResponse response)</div><div><span style="white-space:pre">			</span>throws ServletException, IOException {</div><div><span style="white-space:pre">		</span>System.out.println("receive https request");</div><div><span style="white-space:pre">		</span>Map map=request.getParameterMap();</div><div><span style="white-space:pre">		</span>String user=(((Object[])map.get("user"))[0]).toString();</div><div><span style="white-space:pre">		</span>System.out.println("user="+user);</div><div><span style="white-space:pre">		</span>String pwd=(((Object[])map.get("pwd"))[0]).toString();</div><div><span style="white-space:pre">		</span>System.out.println("pwd="+pwd);</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>//给调用者返回值</div><div><span style="white-space:pre">		</span>PrintWriter write=response.getWriter();</div><div><span style="white-space:pre">		</span>write.write("receive HttpClient success");</div><div><span style="white-space:pre">		</span>write.flush();</div><div><span style="white-space:pre">		</span>write.close();</div><div><span style="white-space:pre">	</span>}</div><div>}</div><div><br /><br /><br /><br /><br />//web.xml<br /><div>&lt;servlet&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;httpsClientRequest&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-class&gt;com.abin.lee.https.ReceiveHttpClientRequest&lt;/servlet-class&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet&gt;</div><div><span style="white-space:pre">	</span>&lt;servlet-mapping&gt;</div><div><span style="white-space:pre">		</span>&lt;servlet-name&gt;httpsClientRequest&lt;/servlet-name&gt;</div><div><span style="white-space:pre">		</span>&lt;url-pattern&gt;/httpsClientRequest&lt;/url-pattern&gt;</div><div><span style="white-space:pre">	</span>&lt;/servlet-mapping&gt;<br /></div><br /><br /><br /><br />//HttpClient测试类<br /><div>package com.abin.lee.test;</div><div></div><div>import java.io.BufferedReader;</div><div>import java.io.FileInputStream;</div><div>import java.io.InputStreamReader;</div><div>import java.security.KeyStore;</div><div>import java.util.ArrayList;</div><div>import java.util.List;</div><div></div><div>import javax.net.ssl.KeyManagerFactory;</div><div>import javax.net.ssl.SSLContext;</div><div>import javax.net.ssl.TrustManager;</div><div>import javax.net.ssl.TrustManagerFactory;</div><div></div><div>import junit.framework.TestCase;</div><div></div><div>import org.apache.http.HttpResponse;</div><div>import org.apache.http.NameValuePair;</div><div>import org.apache.http.client.HttpClient;</div><div>import org.apache.http.client.entity.UrlEncodedFormEntity;</div><div>import org.apache.http.client.methods.HttpPost;</div><div>import org.apache.http.conn.scheme.Scheme;</div><div>import org.apache.http.conn.ssl.SSLSocketFactory;</div><div>import org.apache.http.impl.client.DefaultHttpClient;</div><div>import org.apache.http.message.BasicNameValuePair;</div><div>import org.apache.http.protocol.HTTP;</div><div>import org.junit.Before;</div><div>import org.junit.Test;</div><div></div><div>public class HttpsClient extends TestCase {</div><div><span style="white-space:pre">	</span>private String httpUrl = "https://localhost:8443/global/httpsClientRequest";</div><div><span style="white-space:pre">	</span>// 客户端密钥库</div><div><span style="white-space:pre">	</span>private String sslKeyStorePath;</div><div><span style="white-space:pre">	</span>private String sslKeyStorePassword;</div><div><span style="white-space:pre">	</span>private String sslKeyStoreType;</div><div><span style="white-space:pre">	</span>// 客户端信任的证书</div><div><span style="white-space:pre">	</span>private String sslTrustStore;</div><div><span style="white-space:pre">	</span>private String sslTrustStorePassword;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>@Before</div><div><span style="white-space:pre">	</span>public void setUp() {</div><div><span style="white-space:pre">		</span>sslKeyStorePath = "D:\\home\\tomcat.keystore";</div><div><span style="white-space:pre">		</span>sslKeyStorePassword = "stevenjohn";</div><div><span style="white-space:pre">		</span>sslKeyStoreType = "JKS"; // 密钥库类型，有JKS PKCS12等</div><div><span style="white-space:pre">		</span>sslTrustStore = "D:\\home\\tomcat.keystore";</div><div><span style="white-space:pre">		</span>sslTrustStorePassword = "stevenjohn";</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStorePassword",</div><div><span style="white-space:pre">				</span>sslKeyStorePassword);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);</div><div><span style="white-space:pre">		</span>// 设置系统参数</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.trustStore", sslTrustStore);</div><div><span style="white-space:pre">		</span>System.setProperty("javax.net.ssl.trustStorePassword",</div><div><span style="white-space:pre">				</span>sslTrustStorePassword);</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Test</div><div><span style="white-space:pre">	</span>public void testHttpsClient() {</div><div><span style="white-space:pre">		</span>SSLContext sslContext = null;</div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span>KeyStore kstore = KeyStore.getInstance("jks");</div><div><span style="white-space:pre">			</span>kstore.load(new FileInputStream(sslKeyStorePath),</div><div><span style="white-space:pre">					</span>sslKeyStorePassword.toCharArray());</div><div><span style="white-space:pre">			</span>KeyManagerFactory keyFactory = KeyManagerFactory</div><div><span style="white-space:pre">					</span>.getInstance("sunx509");</div><div><span style="white-space:pre">			</span>keyFactory.init(kstore, sslKeyStorePassword.toCharArray());</div><div></div><div><span style="white-space:pre">			</span>KeyStore tstore = KeyStore.getInstance("jks");</div><div><span style="white-space:pre">			</span>tstore.load(new FileInputStream(sslTrustStore),</div><div><span style="white-space:pre">					</span>sslTrustStorePassword.toCharArray());</div><div><span style="white-space:pre">			</span>TrustManager[] tm;</div><div><span style="white-space:pre">			</span>TrustManagerFactory tmf = TrustManagerFactory</div><div><span style="white-space:pre">					</span>.getInstance("sunx509");</div><div><span style="white-space:pre">			</span>tmf.init(tstore);</div><div><span style="white-space:pre">			</span>tm = tmf.getTrustManagers();</div><div></div><div><span style="white-space:pre">			</span>sslContext = SSLContext.getInstance("SSL");</div><div><span style="white-space:pre">			</span>sslContext.init(keyFactory.getKeyManagers(), tm, null);</div><div><span style="white-space:pre">		</span>} catch (Exception e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}</div><div></div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span>HttpClient httpClient = new DefaultHttpClient();</div><div><span style="white-space:pre">			</span>SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext);</div><div><span style="white-space:pre">			</span>Scheme sch = new Scheme("https", 8443, socketFactory);</div><div><span style="white-space:pre">			</span>httpClient.getConnectionManager().getSchemeRegistry().register(sch);</div><div></div><div><span style="white-space:pre">			</span>HttpPost httpPost = new HttpPost(httpUrl);</div><div><span style="white-space:pre">			</span>List&lt;NameValuePair&gt; nvps = new ArrayList&lt;NameValuePair&gt;();</div><div><span style="white-space:pre">			</span>nvps.add(new BasicNameValuePair("user", "abin"));</div><div><span style="white-space:pre">			</span>nvps.add(new BasicNameValuePair("pwd", "abing"));</div><div></div><div><span style="white-space:pre">			</span>httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));</div><div><span style="white-space:pre">			</span>HttpResponse httpResponse = httpClient.execute(httpPost);</div><div><span style="white-space:pre">			</span>String spt = System.getProperty("line.separator");&nbsp;</div><div><span style="white-space:pre">			</span>BufferedReader buffer = new BufferedReader(new InputStreamReader(</div><div><span style="white-space:pre">					</span>httpResponse.getEntity().getContent()));</div><div><span style="white-space:pre">			</span>StringBuffer stb=new StringBuffer();</div><div><span style="white-space:pre">			</span>String line=null;</div><div><span style="white-space:pre">			</span>while((line=buffer.readLine())!=null){</div><div><span style="white-space:pre">				</span>stb.append(line);</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">			</span>buffer.close();</div><div><span style="white-space:pre">			</span>String result=stb.toString();</div><div><span style="white-space:pre">			</span>System.out.println("result="+result);</div><div><span style="white-space:pre">		</span>} catch (Exception e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}</div><div></div><div><span style="white-space:pre">	</span>}</div><div></div><div>}</div><div></div><br /><br /><br /><br /><br /><br /><br />//tomcat配置文件：（前提是https双向验证证书生成的没有一点问题）<br /><br /><div>&lt;Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"</div><div><span style="white-space:pre">			</span> &nbsp; SSLEnabled="true" maxThreads="150" scheme="https"</div><div><span style="white-space:pre">			</span> &nbsp; secure="true" clientAuth="true" sslProtocol="TLS"</div><div><span style="white-space:pre">			</span> &nbsp; keystoreFile="D:\\home\\tomcat.keystore" keystorePass="stevenjohn"</div><div><span style="white-space:pre">			</span> &nbsp; truststoreFile="D:\\home\\tomcat.keystore" truststorePass="stevenjohn" /&gt;</div><br /><br /><br /></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/388646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-27 00:11 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/27/388646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置HTTPS方式(单向)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 26 Sep 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/388600.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/388600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/388600.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<p>简要记录主要步骤备忘</p>
<p><strong>1、进入到jdk下的bin目录 </strong></p>
<p><strong>2、输入如下指令</strong></p>
<p>keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat.keystore&nbsp;&nbsp;-validity 36500</p>
<p>附：</p>
<p>d:/tomcat.keystore是将生成的tomcat.keystore放到d盘根目录下。</p>
<p><span lang="EN-US">"-validity&nbsp;36500<span lang="EN-US"><span lang="EN-US">&#8221;</span></span><span lang="EN-US">含义是证书有效期，</span>36500</span><span>表示</span><span lang="EN-US">100</span><span>年，默认值是</span><span lang="EN-US">90</span><span>天</span></p>
<p>注意若要放到c盘，在win7系统下，需要以管理员身份进入到命令行中进行操作，否则是无法创建tomcat.keystore的。本例放到d盘下。 <br />如何以管理员身份进入到命令行下呢？开始-&gt;搜索框中输入cmd-&gt;等待（注意不回车）-&gt;出现cmd.exe-&gt;右键&#8220;以管理员身份运行&#8221;即可。 </p>
<p><strong>3、输入keystore密码 </strong></p>
<p>密码任意，此处以123456为例，要记住这个密码，之后在进行server.xml配置时需要使用。 </p>
<p><strong>4、输入名字、组织单位、组织、市、省、国家等信息 </strong></p>
<div>注意事项：</div>
<div>A、Enter keystore password：此处需要输入大于6个字符的字符串</div>
<div>B、&#8220;What is your first and last name?&#8221;这是必填项，并且必须是TOMCAT部署主机的域名或者IP[如：gbcom.com&nbsp;或者&nbsp;10.1.25.251]，就是你将来要在浏览器中输入的访问地址</div>
<div>C、&#8220;What is the name of your organizational unit?&#8221;、&#8220;What is the name of your organization?&#8221;、&#8220;What is the name of your City or Locality?&#8221;、&#8220;What is the name of your State or Province?&#8221;、&#8220;What is the two-letter country code for this unit?&#8221;可以按照需要填写也可以不填写直接回车，在系统询问&#8220;correct?&#8221;时，对照输入信息，如果符合要求则使用键盘输入字母&#8220;y&#8221;，否则输入&#8220;n&#8221;重新填写上面的信息</div>
<div>D、Enter key password for &lt;tomcat&gt;，这项较为重要，会在tomcat配置文件中使用，建议输入与keystore的密码一致，设置其它密码也可以</div>
<div>l&nbsp;&nbsp;完成上述输入后，直接回车则在你在第二步中定义的位置找到生成的文件</div>
<p><strong>5、输入之后会出现确认的提示 </strong></p>
<p>此时输入<strong>y</strong>，并回车。此时创建完成keystore。 <br />进入到D盘根目录下可以看到已经生成的tomcat.xml </p>
<p><strong>6、进入tomcat文件夹 <br /></strong>找到conf目录下的sever.xml并进行编辑 </p>
<p><strong>7、编辑 <br /></strong>&nbsp; &lt;Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" <br />&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" scheme="https" secure="true" <br />&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" keystoreFile="D:/AppServer/Tomcat/apache-tomcat-6.0.32/conf/tomcat.keystore" <br />&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="deleiguo" sslProtocol="TLS" /&gt; <br /><strong>注： <br /></strong>方框中的keystore的密码，就是刚才我们设置的&#8220;123456&#8221;. </p>
<p>编辑完成后关闭并保存sever.xml </p>
<p><strong>8、Tomcat启动成功后，使用https://127.0.0.1:8443 访问页面 </strong></p>
<p>页面成功打开即tomcat下的https配置成功。 </p>
<p>&nbsp;</p>
<p><strong>9、应用程序HTTP自动跳转到HTTPS</strong></p>
<p>在应用程序中web.xml中加入：</p>
<div>&lt;security-constraint&gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;web-resource-collection &gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;web-resource-name &gt;SSL&lt;/web-resource-name&gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/web-resource-collection&gt;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;user-data-constraint&gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/user-data-constraint&gt;&nbsp;</div>
<div>&lt;/security-constraint&gt;</div>
<div>&nbsp;</div>
<div><strong>10、生成安全证书文件</strong></div>
<div>keytool -export -alias tomcat -file D:/file.cer -keystore d:/tomcat.keystore -validity 36500</div>
<div>然后输入d:/tomcat.keystore中的keystore密码</div>
<div>&nbsp;</div>
<div>-file D:/file.cer 即为生成的cer文件，可直接点击安装</div>
<div>&nbsp;</div>
<div>
<div><strong>11、注意事项：</strong></div>
<div>（1）&nbsp;&nbsp;&nbsp;&nbsp;生成证书的时间，如果IE客户端所在机器的时间早于证书生效时间，或者晚于有效时间，IE会提示&#8220;该安全证书已到期或还未生效&#8221;</div>
<div>（2）&nbsp;&nbsp;&nbsp;&nbsp;如果IE提示&#8220;安全证书上的名称无效或者与站点名称不匹配&#8221;，则是由生成证书时填写的服务器所在主机的域名&#8220;您的名字与姓氏是什么？&#8221;/&#8220;What is your first and last name?&#8221;不正确引起的</div>
<div>&nbsp;</div>
<div><strong>12、遗留问题：</strong></div>
<div>（1）如果AC主机不能通过域名查找，必须使用IP，但是这个IP只有在配置后才能确定，这样证书就必须在AC确定IP地址后才能生成</div>
<div>（2）证书文件只能绑定一个IP地址，假设有10.1.25.250&nbsp;和&nbsp;192.168.1.250&nbsp;两个IP地址，在证书生成文件时，如使用了10.1.25.250，通过IE就只能使用10.1.25.250&nbsp;来访问AC-WEB，192.168.1.250是无法访问AC-WEB的。</div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/388600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-26 16:34 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Https单向，双向验证</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/23/388389.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 23 Sep 2012 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/23/388389.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/388389.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/23/388389.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/388389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/388389.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">https一般来说有单项SSL和双向SSL连接之分。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">单项SSL连接，也就是只是客户端验证服务器证书。tomcat中clientAuth="false"的时候，HTTPS单向验证如下：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedReader;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStreamReader;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.OutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.net.URL;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.net.ssl.HostnameVerifier;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.net.ssl.HttpsURLConnection;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.net.ssl.SSLSession;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.logging.Log;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.logging.LogFactory;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ClientSendData&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(ClientSendData.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;客户端信任的证书</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslTrustStore;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslTrustStorePassword;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;Url;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">初始化数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ClientSendData()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStore&nbsp;=&nbsp;"D:/ssl/clientTrust.jks";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStorePassword&nbsp;=&nbsp;"123456";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Url&nbsp;=&nbsp;"https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sendData(String&nbsp;data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;receivedData&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置系统参数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.trustStore",&nbsp;sslTrustStore);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.trustStorePassword",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStorePassword);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receivedData&nbsp;=&nbsp;send(Url,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;receivedData;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;send(String&nbsp;sendurl,&nbsp;String&nbsp;sendData)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;URL(sendurl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HostnameVerifier&nbsp;hv&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HostnameVerifier()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;verify(String&nbsp;urlHostName,&nbsp;SSLSession&nbsp;session)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpsURLConnection.setDefaultHostnameVerifier(hv);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;current&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("begint&nbsp;to&nbsp;open&nbsp;connection&nbsp;at&nbsp;"&nbsp;+&nbsp;current);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpsURLConnection&nbsp;connection&nbsp;=&nbsp;(HttpsURLConnection)&nbsp;url.openConnection();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;end&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("open&nbsp;connection&nbsp;ok&nbsp;at&nbsp;"&nbsp;+&nbsp;end&nbsp;+&nbsp;",cost:"+&nbsp;(end.getTime()&nbsp;-&nbsp;current.getTime()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setRequestProperty("Content-Type",&nbsp;"text/xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setDoOutput(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setDoInput(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setRequestMethod("POST");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setUseCaches(<span style="color: #0000FF; ">false</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setReadTimeout(30000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;data[]&nbsp;=&nbsp;sendData.getBytes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("[SSLIX]notifyEai,begint&nbsp;to&nbsp;write&nbsp;data&nbsp;at&nbsp;"&nbsp;+&nbsp;current);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;out&nbsp;=&nbsp;connection.getOutputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("write&nbsp;data&nbsp;ok&nbsp;at&nbsp;"&nbsp;+&nbsp;end&nbsp;+&nbsp;",cost:"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(end.getTime()&nbsp;-&nbsp;current.getTime()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;receivedData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("begint&nbsp;to&nbsp;read&nbsp;data&nbsp;at&nbsp;"&nbsp;+&nbsp;current);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;inReader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InputStreamReader(connection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream(),&nbsp;"UTF-8");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;aReader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedReader(inReader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aLine;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((aLine&nbsp;=&nbsp;aReader.readLine())&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receivedData.append(aLine);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date(System.currentTimeMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("read&nbsp;data&nbsp;ok&nbsp;at&nbsp;"&nbsp;+&nbsp;end&nbsp;+&nbsp;",cost:"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(end.getTime()&nbsp;-&nbsp;current.getTime()));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("开始返回状态码");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;statusCode&nbsp;=&nbsp;connection.getResponseCode();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("返回状态码:"&nbsp;+&nbsp;statusCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aReader.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.disconnect();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;receivedData.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientSendData&nbsp;t&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClientSendData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.sendData("测试SSL单项连接，向服务端发送数据!");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><p style="margin: 0px; padding: 0px; ">单项认证时，只需要设置客户端信任的证书库就行。但是当是双向认证时，还需要设置客户端密钥库密码。</p><p style="margin: 0px; padding: 0px; ">HTTPS双向验证代码如下：<br /></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ClientSendData&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(EaiChannel.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">客户端密钥库</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslKeyStorePath;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslKeyStorePassword;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslKeyStoreType;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;客户端信任的证书</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslTrustStore;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;sslTrustStorePassword;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;eaiUrl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">初始化数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ClientSendData()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslKeyStorePath&nbsp;=&nbsp;"D:/ssl/clientKeys.jks";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslKeyStorePassword&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;"123456";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslKeyStoreType&nbsp;=&nbsp;"JKS";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">密钥库类型，有JKS&nbsp;PKCS12等</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStore&nbsp;=&nbsp;"D:/ssl/clientTrust.jks";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStorePassword&nbsp;=&nbsp;"123456";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eaiUrl&nbsp;=&nbsp;"https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sendData(String&nbsp;data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;receivedData&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.keyStore",&nbsp;sslKeyStorePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.keyStorePassword",sslKeyStorePassword);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.keyStoreType",&nbsp;sslKeyStoreType);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置系统参数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.trustStore",&nbsp;sslTrustStore);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty("javax.net.ssl.trustStorePassword",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sslTrustStorePassword);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receivedData&nbsp;=&nbsp;send(eaiUrl,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;receivedData;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;send(String&nbsp;sendurl,&nbsp;String&nbsp;sendData)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">和上面一样</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientSendData&nbsp;t&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClientSendData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.sendData("测试SSL双项连接，向服务端发送数据!");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br /><p style="margin: 0px; padding: 0px; ">下面来说说可能会遇到的异常：</p><p style="margin: 0px; padding: 0px; ">1. java.security.NoSuchAlgorithmException</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">一般来说是密钥库类型不对，如上面的sslKeyStoreType = "JKS" 却写成PKCS12。</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">也有可能是证书的问题。</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">2. java.net.UnknownHostException</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">服务端地址不对。</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">3.java.net.SocketException: Unexpected end of file from server</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">这个异常和客户端没有关系，说明已经发送成功。是服务端的问题。有可能是防火墙的原因，也可能是服务端没处理客户端的响应。</p><p style="margin: 0px; padding: 0px; ">另外有人说当URL过长时也会发生此错误，当使用URL发送数据时，可以参考此意见。</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">4.java.io.IOException:server returned HTTP response code :500</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">这个异常是服务端代码的问题。服务端相应代码执行时抛出了异常。</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">最后 如果返回的状态码是200 ，表示成功。</p><br /><p>&nbsp;</p><p>&nbsp;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/388389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-23 22:31 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/23/388389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Https ssl java</title><link>http://www.blogjava.net/stevenjohn/archive/2012/08/23/386102.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 23 Aug 2012 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/08/23/386102.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/386102.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/08/23/386102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/386102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/386102.html</trackback:ping><description><![CDATA[<a href="http://www.iteye.com/topic/1125183">http://www.iteye.com/topic/1125183</a><br /><a href="http://blog.sina.com.cn/s/blog_5f64eccd0100p0pc.html">http://blog.sina.com.cn/s/blog_5f64eccd0100p0pc.html</a><br /><a href="http://www.iteye.com/topic/1125183">http://www.iteye.com/topic/1125183</a><br /><a href="http://hi.baidu.com/zhouqiugang/blog/item/65c9e160177db3cc8cb10d86.html">http://hi.baidu.com/zhouqiugang/blog/item/65c9e160177db3cc8cb10d86.html</a><br /><a href="http://blog.csdn.net/zrbin153/article/details/6026840">http://blog.csdn.net/zrbin153/article/details/6026840</a><br />HttpClient访问https站点证书加载问题 <br /><a href="http://237451446.blog.51cto.com/2307663/759338">http://237451446.blog.51cto.com/2307663/759338</a><br />
<div class="postTitle"><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/sxyx2008/archive/2011/07/08/353940.html"><font color="#000080">HttpClient请求Https协议</font></a> </div><a href="http://www.blogjava.net/sxyx2008/archive/2011/07/08/353940.html">http://www.blogjava.net/sxyx2008/archive/2011/07/08/353940.html</a><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/386102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-08-23 13:54 <a href="http://www.blogjava.net/stevenjohn/archive/2012/08/23/386102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>keytool+tomcat配置HTTPS双向证书认证</title><link>http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 22 Aug 2012 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/385989.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/385989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/385989.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt" class="MsoNormal"></p>
<h3>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">系统需求：</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">1、&nbsp;<wbr>&nbsp;Windows系统或Linux系统</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">2、&nbsp;<wbr>&nbsp;安装并配置JDK 1.6.0_13</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">3、&nbsp;<wbr>&nbsp;安装并配置Tomcat 6.0</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">第一步：为服务器生成证书</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff"><strong>1、&nbsp;<wbr></strong>&nbsp;<strong>Windows</strong><strong>系统</strong></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">&#8220;运行&#8221;控制台，进入%JAVA_HOME%/bin目录</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">使用keytool为Tomcat生成证书，假定目标机器的域名是&#8220;localhost&#8221;，keystore文件存放在&#8220;D:\home\tomcat.keystore&#8221;，口令为&#8220;password&#8221;，使用如下命令生成：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\home\tomcat.keystore&nbsp;-validity 36500</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">(参数简要说明：&#8220;D:\home\tomcat.keystore&#8221;含义是将证书文件的保存路径，证书文件名称是tomcat.keystore ；&#8220;-validity 36500&#8221;含义是证书有效期，36500表示100年，默认值是90天)</span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">在命令行填写必要参数：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">A、输入keystore密码：此处需要输入大于6个字符的字符串</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">B、&#8220;您的名字与姓氏是什么？&#8221;这是必填项，并且必须是TOMCAT部署主机的域名或者IP[如：gbcom.com 或者 10.1.25.251]（就是你将来要在浏览器中输入的访问地址），否则浏览器会弹出警告窗口，提示用户证书与所在域不匹配。在本地做开发测试时，应填入&#8220;localhost&#8221;</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">C、&#8220;你的组织单位名称是什么？&#8221;、&#8220;您的组织名称是什么？&#8221;、&#8220;您所在城市或区域名称是什么？&#8221;、&#8220;您所在的州或者省份名称是什么？&#8221;、&#8220;该单位的两字母国家代码是什么？&#8221;可以按照需要填写也可以不填写直接回车，在系统询问&#8220;正确吗？&#8221;时，对照输入信息，如果符合要求则使用键盘输入字母&#8220;y&#8221;，否则输入&#8220;n&#8221;重新填写上面的信息</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">D、输入&lt;tomcat&gt;的主密码，这项较为重要，会在tomcat配置文件中使用，建议输入与keystore的密码一致，设置其它密码也可以</span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">完成上述输入后，直接回车则在你在第二步中定义的位置找到生成的文件</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff"><strong>2、&nbsp;<wbr></strong>&nbsp;<strong>Linux</strong><strong>系统</strong></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">&#8220;运行&#8221;控制台，进入%JAVA_HOME%/bin目录</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">使用如下命令生成：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">./keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/local/ac/web/tomcat.keystore -validity 36500</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">(参数简要说明：&#8220;/etc/tomcat.keystore&#8221;含义是将证书文件保存在路径/usr/local/ac/web/下，证书文件名称是tomcat.keystore ；&#8220;-validity 36500&#8221;含义是证书有效期，36500表示100年，默认值是90天)</span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">在命令行填写必要参数：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">A、Enter keystore password：此处需要输入大于6个字符的字符串</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">B、&#8220;What is your first and last name?&#8221;这是必填项，并且必须是TOMCAT部署主机的域名或者IP[如：gbcom.com 或者 10.1.25.251]，就是你将来要在浏览器中输入的访问地址</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">C、&#8220;What is the name of your organizational unit?&#8221;、&#8220;What is the name of your organization?&#8221;、&#8220;What is the name of your City or Locality?&#8221;、&#8220;What is the name of your State or Province?&#8221;、&#8220;What is the two-letter country code for this unit?&#8221;可以按照需要填写也可以不填写直接回车，在系统询问&#8220;correct?&#8221;时，对照输入信息，如果符合要求则使用键盘输入字母&#8220;y&#8221;，否则输入&#8220;n&#8221;重新填写上面的信息</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">D、Enter key password for &lt;tomcat&gt;，这项较为重要，会在tomcat配置文件中使用，建议输入与keystore的密码一致，设置其它密码也可以</span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">完成上述输入后，直接回车则在你在第二步中定义的位置找到生成的文件</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">第二步：为客户端生成证书</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">为浏览器生成证书，以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox，证书格式应该是PKCS12，因此，使用如下命令生成：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\home\mykey.p12</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">对应的证书库存放在&#8220;D:\home\mykey.p12&#8221;，客户端的CN可以是任意值。双击mykey.p12文件，即可将证书导入至浏览器（客户端）。</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">第三步：让服务器信任客户端证书</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">由于是双向SSL认证，服务器必须要信任客户端证书，因此，必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入，必须先把客户端证书导出为一个单独的CER文件，使用如下命令：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -export -alias mykey -keystore D:\home\mykey.p12 -storetype PKCS12 -storepass password -rfc -file D:\home\mykey.cer</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">通过以上命令，客户端证书就被我们导出到&#8220;D:\home\mykey.cer&#8221;文件了。下一步，是将该文件导入到服务器的证书库，添加为一个信任证书：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -import -v -file D:\home\mykey.cer -keystore D:\home\tomcat.keystore</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">通过list命令查看服务器的证书库，可以看到两个证书，一个是服务器证书，一个是受信任的客户端证书：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -list -keystore D:\home\tomcat.keystore</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">第四步：让客户端信任服务器证书</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">由于是双向SSL认证，客户端也要验证服务器证书，因此，必须把服务器证书添加到浏览的&#8220;受信任的根证书颁发机构&#8221;。由于不能直接将keystore格式的证书库导入，必须先把服务器证书导出为一个单独的CER文件，使用如下命令：</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">通过以上命令，服务器证书就被我们导出到&#8220;D:\home\tomcat.cer&#8221;文件了。双击tomcat.cer文件，按照提示安装证书，将证书填入到&#8220;受信任的根证书颁发机构&#8221;。</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff"><strong>第四步：配置</strong><strong>Tomcat</strong><strong>服务器</strong></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">打开Tomcat根目录下的/conf/server.xml，找到如下配置段，修改如下：</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&lt;Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"<br />SSLEnabled="true" maxThreads="150" scheme="https"<br />secure="true" clientAuth="true" sslProtocol="TLS"<br />keystoreFile="D:\\home\\test.keystore" keystorePass="123456"<br />truststoreFile="D:\\home\\test.keystore" truststorePass="123456" /&gt;</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">属性说明：</span></p>
<ul style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; font-size: 14px; border-left-width: 0px; font-weight: normal; padding-top: 0px"><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">clientAuth:设置是否双向验证，默认为false，设置为true代表双向验证</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">keystoreFile:服务器证书文件路径</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">keystorePass:服务器证书密码</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">truststoreFile:用来验证客户端证书的根证书，此例中就是服务器证书</span></li><li style="padding-bottom: 0px; line-height: 25px; border-right-width: 0px; list-style-type: disc; margin: 0px 0px 0px 30px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><span style="background-color: #ffffff">truststorePass:根证书密码</span></li></ul>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><strong style="line-height: 25px; background-color: #ffffff">第五步：测试</strong></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">&nbsp;<wbr></span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin-top: 0px; padding-left: 0px; padding-right: 0px; font-family: simsun; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; color: #5f656c; margin-left: 0px; font-size: 14px; word-break: normal; border-left-width: 0px; font-weight: normal; margin-right: 0px; padding-top: 0px"><span style="line-height: 25px; background-color: #ffffff">在浏览器中输入:https://localhost:8443/，会弹出选择客户端证书界面，点击&#8220;确定&#8221;，会进入tomcat主页，地址栏后会有&#8220;锁&#8221;图标，表示本次会话已经通过HTTPS双向验证，接下来的会话过程中所传输的信息都已经过SSL信息加密。<br /><br /><br />注意事项：貌似导入证书的时候，最好导入到&#8220;个人&#8221;那一栏里面，貌似客户端的用户名不填写也是可以的，或者随便填写。<br /><br /></span><a href="http://licg1234.blog.163.com/blog/static/13908233320121165356868/">http://licg1234.blog.163.com/blog/static/13908233320121165356868/</a>&nbsp;<span style="line-height: 25px; background-color: #ffffff"><br /></span></p><br /></h3>
<p>&nbsp;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/385989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-08-22 09:52 <a href="http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>