??xml version="1.0" encoding="utf-8" standalone="yes"?>segui88久久综合9999,欧美区二区三区,亚洲欧美在线观看http://www.aygfsteel.com/stevenjohn/category/52693.html那些青春的岁?/description>zh-cnSun, 10 May 2015 23:15:39 GMTSun, 10 May 2015 23:15:39 GMT60Http Https Webservicehttp://www.aygfsteel.com/stevenjohn/archive/2015/05/10/424974.htmlabinabinSun, 10 May 2015 03:27:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/05/10/424974.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424974.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/05/10/424974.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424974.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424974.html1.Http作ؓ(f)web服务的首选协议,居有4大优点:(x)
   1Qhttp非常单,以纯文本(文?形式~码的请求和响应l成
   2Qhttp是无状态的。一旦发送了一个httphQ客户和服务器之间的q接信息׃(x)被释放,有利于减服务器资源的消耗?br />   3Qhttp的运行端?0Q在大多数防火墙上是公开?br />   4Q行业认可?br />  但是Http的缺点:(x)
   1Q缺对异步消息的支?br />   2Q消息传输的不可靠?br />

web service相对http (post/get)有好处吗Q?/h3>

 

1.接口中实现的Ҏ(gu)和要求参C目了?/p>

2.不用担心大小写问?/p>

3.不用担心中文urlencode问题

4.代码中不用多ơ声明认?账号,密码)参数

5.传递参数可以ؓ(f)数组Q对象等...

http和webservice的区别:(x)
1、http是采用getQpost{方式传输数据,而webservice是采用xml格式打包数据Q传输是Zhttp协议q行传输?br />2、http直接传输数据Q而webservice是采用xml~解码数据,所以能速度上面有些慢?br />3、webservice可以直接传输数组或者对象的数据格式Q实际现在常用的http+json也可以的Q只是需要进行字W串和各U格式的转换?br />4、http传输占用的带宽要比webservice占用的带宽少?br />5、webservice支持用户权限的验证,而http不支持直接的用户权限验证?br />6、webservice接口中实现的Ҏ(gu)和要求参C目了然?br />

HTTPS和HTTP的区别:(x)
https协议需要到ca甌证书Q一般免费证书很,需要交贏V?br />http是超文本传输协议Q信息是明文传输Qhttps 则是h安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一?前者是80,后者是443?br />http的连接很?是无状态的
HTTPS协议是由SSL+HTTP协议构徏的可q行加密传输、n份认证的|络协议 要比http协议安全


SSL协议基础

SSL协议位于TCP/IP协议与各U应用层协议之间Q本w又分ؓ(f)两层Q?/p>

SSL记录协议(SSL Record Protocol)Q徏立在可靠传输层协?TCP)之上Qؓ(f)上层协议提供数据装、压~、加密等基本功能?/p>

SSL握手协议(SSL Handshake Procotol)Q在SSL记录协议之上Q用于实际数据传输前Q通讯双方q行w䆾认证、协商加密算法、交换加密密钥等?/p>

HTTPS通信q程Q?/div>
1.在服务器端存在一个公钥及(qing)U钥
2.客户端从服务器取得这个公?/div>
3.客户端生一个随机的密钥
4.客户端通过公钥对密钥加密(非对U加密)
5.客户端发送到服务器端
6.服务器端接受q个密钥q且以后的服务器端和客户端的数据全部通过q个密钥加密Q对U加密)























abin 2015-05-10 11:27 发表评论
]]> web.xml中配|http讉K转向httpshttp://www.aygfsteel.com/stevenjohn/archive/2013/01/06/393883.htmlabinabinSun, 06 Jan 2013 13:28:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/01/06/393883.htmlhttp://www.aygfsteel.com/stevenjohn/comments/393883.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/01/06/393883.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/393883.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/393883.html1.tomcat下所有应用都强制https讉K

在tomcat\conf\web.xml中的</welcome-file-list>后面加上以下配置:


  <login-config>
      <!-- Authorization setting for SSL -->
      <auth-method>CLIENT-CERT</auth-method>
      <realm-name>Client Cert Users-only Area</realm-name>
  </login-config>
  <security-constraint>
      <!-- Authorization setting for SSL -->
      <web-resource-collection >
          <web-resource-name >SSL</web-resource-name>
          <url-pattern>/*</url-pattern>
      </web-resource-collection>
      <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>
  </security-constraint>





2.单个应用强制https讉K

WEB-INF/web.xml?lt;/welcome-file-list>后面加上以下配置:

  <login-config>
      <!-- Authorization setting for SSL -->
      <auth-method>CLIENT-CERT</auth-method>
      <realm-name>Client Cert Users-only Area</realm-name>
  </login-config>
  <security-constraint>
      <!-- Authorization setting for SSL -->
      <web-resource-collection >
          <web-resource-name >SSL</web-resource-name>
          <url-pattern>/*</url-pattern>
      </web-resource-collection>
      <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>
  </security-constraint>






abin 2013-01-06 21:28 发表评论
]]>
HttpClient 实现跌{hhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388733.htmlabinabinThu, 27 Sep 2012 12:31:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388733.htmlhttp://www.aygfsteel.com/stevenjohn/comments/388733.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388733.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/388733.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/388733.html
试UnionPayServlet的httpClient试c:(x)
  package com.abin.lee.https;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import junit.framework.TestCase;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentProducer;
import org.apache.http.entity.EntityTemplate;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
public class HttpClientTest extends TestCase {
private static final String Url = "http://localhost:9090/Spa/UnionPayServlet";
@Test
public void testHttpClient() throws Exception {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(Url);
ContentProducer create = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
Writer writer = new OutputStreamWriter(outstream, "UTF-8");
writer.write("start");
writer.flush();
writer.close();
}
};
HttpEntity request = new EntityTemplate(create);
post.setEntity(request);
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
System.out.println("the last message is: "+result);
}
}



//被访问的servletQ也是中间servlet
package org.litsoft.air.servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentProducer;
import org.apache.http.entity.EntityTemplate;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class UnionPayServlet extends HttpServlet {
private static final String Url = "http://localhost:9090/Spa/changeServlet";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("UnionPayServlet");
String result=null;
BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));
int num=0;
char[] buffer=new char[1024];
while((num=reader.read(buffer))!=-1){
result=new String(buffer,0,num);
}
System.out.println("from HttpCLient message is: ="+result);
final String transfer=result;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(Url);
ContentProducer create = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
Writer writer = new OutputStreamWriter(outstream, "UTF-8");
writer.write(transfer);
writer.flush();
writer.close();
}
};
HttpEntity httpEntity = new EntityTemplate(create);
post.setEntity(httpEntity);
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
String result1 = EntityUtils.toString(entity);
// System.out.println(result1);
ServletOutputStream out=response.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
writer.write("this message is received by UnionPayServlet is: "+result1);
writer.flush();
writer.close();
}
@Override
public void destroy() {
super.destroy();
}
}




//最l要处理的servlet
package org.litsoft.air.servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.litsoft.air.unionpay.CreateJdomOne;
public class ChangeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 接收Servlet传回来的信息
BufferedReader reader = new BufferedReader(new InputStreamReader(
request.getInputStream()));
String show = null;
StringBuffer stb = new StringBuffer();
while ((show = reader.readLine()) != null) {
stb.append(show);
}
System.out.println("from UnionPayServlet message is :" + stb.toString());
reader.close();
ServletOutputStream out=response.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
writer.write("this message is received by ChangeServlet is :"+stb.toString());
writer.flush();
writer.close();
}
}


//servlet的配|?br />
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>UnionPayServlet</servlet-name>
<servlet-class>org.litsoft.air.servlet.UnionPayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UnionPayServlet</servlet-name>
<url-pattern>/UnionPayServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>changeServlet</servlet-name>
<servlet-class>org.litsoft.air.servlet.ChangeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>changeServlet</servlet-name>
<url-pattern>/changeServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


abin 2012-09-27 20:31 发表评论
]]>
HttpsUrlConnection https双向验证http://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388647.htmlabinabinWed, 26 Sep 2012 16:16:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388647.htmlhttp://www.aygfsteel.com/stevenjohn/comments/388647.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388647.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/388647.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/388647.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/08/22/385989.html 
应该正常来说Q按照这个教E做的话是没有Q何问题的Q但是也有些朋友问题Q主要问题是在,把证书导入到览器里面的时候出的,注意q里?br />
我这里面的我都做q三四次了,基本没啥问题。但也不排除不会(x)不出问题?br />
׃|上关于httpCilent来测试调用HTTPS的例子较?yu),l过在度娘和L(fng)的查找,ȝ是也扑ֈ了一文章,参考以后,做出来一个测试类Q在我机器上面是能够跑通的。具体地址Q?a href="http://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388646.html">http://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388646.html 



//首先说一下,q个是我随便写的一个发布到tomcat的httpsUrlConnection的Servlet服务Q主要是用来试一下https双向验证的,现在|上好多的文章都是https单向验证的Java代码Q我在网上看q好多,但是好多都是半成品,然后ȝ了一下,在自q机器上面是完全能够跑通的Q在q里做个W记Q以后用得着的时候来拿:(x)
package com.abin.lee.https;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class ReceiveHttpsUrlConnectionRequest extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("receive https request");
                /**q个主要是接Ӟ由对方给以POST形式发过来的内容Q这U内容不是以key-value的Ş式发的,而是直接通过Java?br />                *string content="test https double auth";
                *BufferedWriter writer  = new BufferedWriter();
                *writer.writer(content.getBytes());
                *通过q种形式发过来的内容的接Ӟ׃直接攑ֈrequest里面发送过来的Q所以的从request里面来接收?br />                *之前做银联的手机支付的时候也是这么传递参数的?br />                */
BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));
String line=null;
StringBuffer stb=new StringBuffer();
                //循环的一行一行的d内容
     while((line=reader.readLine())!=null){
stb.append(line);
}
                //打印d到的内容?/div>
System.out.println("stb="+stb.toString());
                //l调用者返回内?/div>
PrintWriter write=response.getWriter();
write.write("receive HttpsUrlConnection success");
write.flush();
write.close();
}
}




//q个是在web工程里面的web.xml里面配置的发布的servlet服务
//web.xml
<servlet>
<servlet-name>httpsUrlConnectionRequest</servlet-name>
<servlet-class>com.abin.lee.https.ReceiveHttpsUrlConnectionRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpsUrlConnectionRequest</servlet-name>
<url-pattern>/httpsUrlConnectionRequest</url-pattern>
</servlet-mapping>

//HttpsUrlConnection试c?br />
package com.abin.lee.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
public class HttpsUrlConnectionClient extends TestCase {
// 客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信ȝ证书
private String sslTrustStore;
private String sslTrustStorePassword;
        //上面发布的servleth地址
private String httpsUrlConnectionUrl = "https://localhost:8443/global/httpsUrlConnectionRequest";
@Before
public void setUp() {
                //q是密钥?br />     sslKeyStorePath = "D:\\home\\tomcat.keystore";
sslKeyStorePassword = "stevenjohn";
sslKeyStoreType = "JKS"; // 密钥库类型,有JKS PKCS12{?br />                //信Q库,q里需要服务端来新人客L(fng)才能调用Q因个我是配|的https双向验证Q不但是要客L(fng)信Q服务端,服务端也要信dL(fng)?/div>
sslTrustStore = "D:\\home\\tomcat.keystore";
sslTrustStorePassword = "stevenjohn";
System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword",
sslKeyStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
// 讄pȝ参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
System.setProperty("java.protocol.handler.pkgs", "sun.net.www.protocol");
}
@Test
public void testHttpsUrlConnectionClient() {
try {
URL url = new URL(httpsUrlConnectionUrl);
                        //对于L名的验证Q因为配|服务器端的tomcat.keystore的证书的时候,是需要填写用户名的,一般用户名来说是本地ip地址Q或者本地配|的域名
     HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
                        //~写HttpsURLConnection 的请求对象,q里需要注意HttpsURLConnection 比我们^时用的HttpURLConnection对了一个sQ因为https是也是遵循http协议的,q且是采用sslq个安全套接字来传输信息的,但是也有可能遭到黑客的攻? 
HttpsURLConnection connection = (HttpsURLConnection) url
.openConnection();
connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
connection.setDoInput(true);
                        //讄h方式为post,q里面当然也可以用getQ但是我q里必须用post
     connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setReadTimeout(30000);
String user="abin";
String pwd="abing";
String request="user="+user+"&pwd="+pwd;
OutputStream out = connection.getOutputStream();
                        //下面的这句话是给servlet发送请求内?/div>
out.write(request.getBytes());
out.flush();
out.close();
//接收h的返回?/div>
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer stb = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
stb.append(line);
}
Integer statusCode = connection.getResponseCode();
System.out.println("q回状态码:" + statusCode);
reader.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}




//发布好了服务Q你需要在tomcat里面配置好了https服务的端口才能用?br />//tomcat配置文gQ?br />
 <Connector port="6060" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
        
        /**关于https端口的说明,银联一般用的都?--9  443,q种cd的端口,W一位是0--9中的L一位,然后后面三位?43Q而通过我的试Q发觉随便一个端口号都可           *   以的Q只要不和你机器的其他端口冲H就行,911,95553q些端口都是可以滴?br />          *clientAuth="true"   q里讄为false是https单向认证Q设|ؓ(f)true则是https双向认证
        */
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  SSLEnabled="true" maxThreads="150" scheme="https"
  secure="true" clientAuth="true" sslProtocol="TLS"
  keystoreFile="D:\\home\\tomcat.keystore" keystorePass="stevenjohn"  //密钥?/div>
  truststoreFile="D:\\home\\tomcat.keystore" truststorePass="stevenjohn" />//信Q?/div>


abin 2012-09-27 00:16 发表评论
]]>HttpClient https双向验证http://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388646.htmlabinabinWed, 26 Sep 2012 16:11:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388646.htmlhttp://www.aygfsteel.com/stevenjohn/comments/388646.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/27/388646.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/388646.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/388646.html
package com.abin.lee.https;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class ReceiveHttpClientRequest extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("receive https request");
Map map=request.getParameterMap();
String user=(((Object[])map.get("user"))[0]).toString();
System.out.println("user="+user);
String pwd=(((Object[])map.get("pwd"))[0]).toString();
System.out.println("pwd="+pwd);
//l调用者返回?/div>
PrintWriter write=response.getWriter();
write.write("receive HttpClient success");
write.flush();
write.close();
}
}





//web.xml
<servlet>
<servlet-name>httpsClientRequest</servlet-name>
<servlet-class>com.abin.lee.https.ReceiveHttpClientRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpsClientRequest</servlet-name>
<url-pattern>/httpsClientRequest</url-pattern>
</servlet-mapping>




//HttpClient试c?br />
package com.abin.lee.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import junit.framework.TestCase;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.junit.Before;
import org.junit.Test;
public class HttpsClient extends TestCase {
private String httpUrl = "https://localhost:8443/global/httpsClientRequest";
// 客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信ȝ证书
private String sslTrustStore;
private String sslTrustStorePassword;
@Before
public void setUp() {
sslKeyStorePath = "D:\\home\\tomcat.keystore";
sslKeyStorePassword = "stevenjohn";
sslKeyStoreType = "JKS"; // 密钥库类型,有JKS PKCS12{?/div>
sslTrustStore = "D:\\home\\tomcat.keystore";
sslTrustStorePassword = "stevenjohn";
System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword",
sslKeyStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
// 讄pȝ参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
}
@Test
public void testHttpsClient() {
SSLContext sslContext = null;
try {
KeyStore kstore = KeyStore.getInstance("jks");
kstore.load(new FileInputStream(sslKeyStorePath),
sslKeyStorePassword.toCharArray());
KeyManagerFactory keyFactory = KeyManagerFactory
.getInstance("sunx509");
keyFactory.init(kstore, sslKeyStorePassword.toCharArray());
KeyStore tstore = KeyStore.getInstance("jks");
tstore.load(new FileInputStream(sslTrustStore),
sslTrustStorePassword.toCharArray());
TrustManager[] tm;
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("sunx509");
tmf.init(tstore);
tm = tmf.getTrustManagers();
sslContext = SSLContext.getInstance("SSL");
sslContext.init(keyFactory.getKeyManagers(), tm, null);
} catch (Exception e) {
e.printStackTrace();
}
try {
HttpClient httpClient = new DefaultHttpClient();
SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext);
Scheme sch = new Scheme("https", 8443, socketFactory);
httpClient.getConnectionManager().getSchemeRegistry().register(sch);
HttpPost httpPost = new HttpPost(httpUrl);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("user", "abin"));
nvps.add(new BasicNameValuePair("pwd", "abing"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse httpResponse = httpClient.execute(httpPost);
String spt = System.getProperty("line.separator"); 
BufferedReader buffer = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
StringBuffer stb=new StringBuffer();
String line=null;
while((line=buffer.readLine())!=null){
stb.append(line);
}
buffer.close();
String result=stb.toString();
System.out.println("result="+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}







//tomcat配置文gQ(前提是https双向验证证书生成的没有一炚w题)

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  SSLEnabled="true" maxThreads="150" scheme="https"
  secure="true" clientAuth="true" sslProtocol="TLS"
  keystoreFile="D:\\home\\tomcat.keystore" keystorePass="stevenjohn"
  truststoreFile="D:\\home\\tomcat.keystore" truststorePass="stevenjohn" />





abin 2012-09-27 00:11 发表评论
]]>Tomcat配置HTTPS方式(单向)http://www.aygfsteel.com/stevenjohn/archive/2012/09/26/388600.htmlabinabinWed, 26 Sep 2012 08:34:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/26/388600.htmlhttp://www.aygfsteel.com/stevenjohn/comments/388600.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/26/388600.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/388600.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/388600.html

要记录主要步骤备?/p>

1、进入到jdk下的bin目录

2、输入如下指?/strong>

keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat.keystore  -validity 36500

附:(x)

d:/tomcat.keystore是将生成的tomcat.keystore攑ֈd盘根目录下?/p>

"-validity 36500含义是证书有效期Q?/span>36500表示100q_(d)默认值是90?/span>

注意若要攑ֈc盘,在win7pȝ下,需要以理员n份进入到命o(h)行中q行操作Q否则是无法创徏tomcat.keystore的。本例放到d盘下?
如何以管理员w䆾q入到命令行下呢Q开?>搜烦框中输入cmd->{待Q注意不回RQ?>出现cmd.exe->右键“以管理员w䆾q行”卛_?

3、输入keystore密码

密码LQ此处以123456ZQ要Cq个密码Q之后在q行server.xml配置旉要用?

4、输入名字、组l单位、组l、市、省、国家等信息

注意事项Q?/div>
A、Enter keystore passwordQ此处需要输入大?个字W的字符?/div>
B?#8220;What is your first and last name?”q是必填,q且必须是TOMCAT部vL的域名或者IP[如:(x)gbcom.com 或?nbsp;10.1.25.251]Q就是你来要在览器中输入的访问地址
C?#8220;What is the name of your organizational unit?”?#8220;What is the name of your organization?”?#8220;What is the name of your City or Locality?”?#8220;What is the name of your State or Province?”?#8220;What is the two-letter country code for this unit?”可以按照需要填写也可以不填写直接回车,在系l询?#8220;correct?”Ӟ对照输入信息Q如果符合要求则使用键盘输入字母“y”Q否则输?#8220;n”重新填写上面的信?/div>
D、Enter key password for <tomcat>Q这较为重要,?x)在tomcat配置文g中用,输入与keystore的密码一_(d)讄其它密码也可?/div>
l  完成上述输入后,直接回R则在你在W二步中定义的位|找到生成的文g

5、输入之后会(x)出现认的提C?

此时输入yQƈ回R。此时创建完成keystore?
q入到D盘根目录下可以看到已l生成的tomcat.xml

6、进入tomcat文g?
扑ֈconf目录下的sever.xmlq进行编?

7、编?
  <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
     maxThreads="150" scheme="https" secure="true"
     clientAuth="false" keystoreFile="D:/AppServer/Tomcat/apache-tomcat-6.0.32/conf/tomcat.keystore"
     keystorePass="deleiguo" sslProtocol="TLS" />
注:(x)
Ҏ(gu)中的keystore的密码,是刚才我们讄?#8220;123456”.

~辑完成后关闭ƈ保存sever.xml

8、Tomcat启动成功后,使用https://127.0.0.1:8443 讉K面

面成功打开即tomcat下的https配置成功?

 

9、应用程序HTTP自动跌{到HTTPS

在应用程序中web.xml中加入:(x)

<security-constraint> 
       <web-resource-collection > 
              <web-resource-name >SSL</web-resource-name> 
              <url-pattern>/*</url-pattern> 
       </web-resource-collection>
                             
       <user-data-constraint> 
              <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
       </user-data-constraint> 
</security-constraint>
 
10、生成安全证书文?/strong>
keytool -export -alias tomcat -file D:/file.cer -keystore d:/tomcat.keystore -validity 36500
然后输入d:/tomcat.keystore中的keystore密码
 
-file D:/file.cer 即ؓ(f)生成的cer文gQ可直接点击安装
 
11、注意事:(x)
Q?Q?nbsp;   生成证书的时_(d)如果IE客户端所在机器的旉早于证书生效旉Q或者晚于有效时_(d)IE?x)提C?#8220;该安全证书已到期或还未生?#8221;
Q?Q?nbsp;   如果IE提示“安全证书上的名称无效或者与站点名称不匹?#8221;Q则是由生成证书时填写的服务器所在主机的域名“(zhn)的名字与姓氏是什么?”/“What is your first and last name?”不正引L(fng)
 
12、遗留问题:(x)
Q?Q如果ACL不能通过域名查找Q必M用IPQ但是这个IP只有在配|后才能定Q这栯书就必须在AC定IP地址后才能生?/div>
Q?Q证书文件只能绑定一个IP地址Q假设有10.1.25.250 ?nbsp;192.168.1.250 两个IP地址Q在证书生成文gӞ如用了10.1.25.250Q通过IE只能?0.1.25.250 来访问AC-WEBQ?92.168.1.250是无法访问AC-WEB的?/div>


abin 2012-09-26 16:34 发表评论
]]>Java Https单向Q双向验?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/stevenjohn/archive/2012/09/23/388389.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/388389.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/09/23/388389.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/388389.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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和双向SSLq接之分?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; "> </p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">单项SSLq接Q也是只是客户端验证服务器证书。tomcat中clientAuth="false"的时候,HTTPS单向验证如下Q?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> java.io.BufferedReader;<br /><span style="color: #0000FF; ">import</span> java.io.InputStreamReader;<br /><span style="color: #0000FF; ">import</span> java.io.OutputStream;<br /><span style="color: #0000FF; ">import</span> java.net.URL;<br /><span style="color: #0000FF; ">import</span> java.util.Date;<br /><span style="color: #0000FF; ">import</span> javax.net.ssl.HostnameVerifier;<br /><span style="color: #0000FF; ">import</span> javax.net.ssl.HttpsURLConnection;<br /><span style="color: #0000FF; ">import</span> javax.net.ssl.SSLSession;<br /><span style="color: #0000FF; ">import</span> org.apache.commons.logging.Log;<br /><span style="color: #0000FF; ">import</span> org.apache.commons.logging.LogFactory;<br /><br /><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">class</span> ClientSendData {<br />    <span style="color: #0000FF; ">static</span> Log log = LogFactory.getLog(ClientSendData.<span style="color: #0000FF; ">class</span>);<br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 客户端信ȝ证书</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">private</span> String sslTrustStore;<br />    <span style="color: #0000FF; ">private</span> String sslTrustStorePassword;<br />    <span style="color: #0000FF; ">private</span> String Url;<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; ">初始化数?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span> ClientSendData() {<br />        sslTrustStore = "D:/ssl/clientTrust.jks";<br />        sslTrustStorePassword = "123456";<br />        Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";<br />    }<br /><br />    <span style="color: #0000FF; ">public</span> String sendData(String data) {<br />        String receivedData = <span style="color: #0000FF; ">null</span>;<br />        <span style="color: #0000FF; ">try</span> {<br />            <span style="color: #008000; ">//</span><span style="color: #008000; ">讄pȝ参数</span><span style="color: #008000; "><br /></span>            System.setProperty("javax.net.ssl.trustStore", sslTrustStore);<br />            System.setProperty("javax.net.ssl.trustStorePassword",<br />                    sslTrustStorePassword);<br />            receivedData = send(Url, data);<br />        } <span style="color: #0000FF; ">catch</span> (Exception e) {<br />            e.printStackTrace();<br />        }<br />        <span style="color: #0000FF; ">return</span> receivedData;<br />    }<br /><br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">static</span> String send(String sendurl, String sendData)<br />            <span style="color: #0000FF; ">throws</span> Exception {<br />        URL url = <span style="color: #0000FF; ">new</span> URL(sendurl);<br />        HostnameVerifier hv = <span style="color: #0000FF; ">new</span> HostnameVerifier() {<br />            <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">boolean</span> verify(String urlHostName, SSLSession session) {<br />                <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />            }<br />        };<br />        System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");<br />        HttpsURLConnection.setDefaultHostnameVerifier(hv);<br />        Date current = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("begint to open connection at " + current);<br />        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();<br />        Date end = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("open connection ok at " + end + ",cost:"+ (end.getTime() - current.getTime()));<br />        connection.setRequestProperty("Content-Type", "text/xml");<br />        connection.setDoOutput(<span style="color: #0000FF; ">true</span>);<br />        connection.setDoInput(<span style="color: #0000FF; ">true</span>);<br />        connection.setRequestMethod("POST");<br />        connection.setUseCaches(<span style="color: #0000FF; ">false</span>);<br />        connection.setReadTimeout(30000);<br />        <span style="color: #0000FF; ">byte</span> data[] = sendData.getBytes();<br />        current = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("[SSLIX]notifyEai,begint to write data at " + current);<br />        OutputStream out = connection.getOutputStream();<br />        out.write(data);<br />        end = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("write data ok at " + end + ",cost:"<br />                + (end.getTime() - current.getTime()));<br />        StringBuffer receivedData = <span style="color: #0000FF; ">new</span> StringBuffer();<br />        current = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("begint to read data at " + current);<br />        InputStreamReader inReader = <span style="color: #0000FF; ">new</span> InputStreamReader(connection<br />                .getInputStream(), "UTF-8");<br />        BufferedReader aReader = <span style="color: #0000FF; ">new</span> BufferedReader(inReader);<br />        String aLine;<br />        <span style="color: #0000FF; ">while</span> ((aLine = aReader.readLine()) != <span style="color: #0000FF; ">null</span>) {<br />            receivedData.append(aLine);<br />        }<br />        end = <span style="color: #0000FF; ">new</span> Date(System.currentTimeMillis());<br />        log.info("read data ok at " + end + ",cost:"<br />                + (end.getTime() - current.getTime()));<br /><br />        log.info("开始返回状态码");<br />        Integer statusCode = connection.getResponseCode();<br />        log.info("q回状态码:" + statusCode);<br />        aReader.close();<br />        connection.disconnect();<br />        <span style="color: #0000FF; ">return</span> receivedData.toString();<br />    }<br /><br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">void</span> main(String[] args) {<br />        ClientSendData t = <span style="color: #0000FF; ">new</span> ClientSendData();<br />        t.sendData("试SSL单项q接Q向服务端发送数?");<br />    }<br />}</div><br /><p style="margin: 0px; padding: 0px; ">单项认证Ӟ只需要设|客L(fng)信Q的证书库p。但是当是双向认证时Q还需要设|客L(fng)密钥库密码?/p><p style="margin: 0px; padding: 0px; ">HTTPS双向验证代码如下Q?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> <span style="color: #0000FF; ">class</span> ClientSendData {<br />    <span style="color: #0000FF; ">static</span> Log log = LogFactory.getLog(EaiChannel.<span style="color: #0000FF; ">class</span>);<br />    <span style="color: #008000; ">//</span><span style="color: #008000; ">客户端密钥库</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">private</span> String sslKeyStorePath;<br />    <span style="color: #0000FF; ">private</span> String sslKeyStorePassword;<br />    <span style="color: #0000FF; ">private</span> String sslKeyStoreType;<br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 客户端信ȝ证书</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">private</span> String sslTrustStore;<br />    <span style="color: #0000FF; ">private</span> String sslTrustStorePassword;<br />    <span style="color: #0000FF; ">private</span> String eaiUrl;<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; ">初始化数?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span> ClientSendData() {<br />        sslKeyStorePath = "D:/ssl/clientKeys.jks";<br />        sslKeyStorePassword     = "123456";<br />        sslKeyStoreType = "JKS"; <span style="color: #008000; ">//</span><span style="color: #008000; ">密钥库类型,有JKS PKCS12{?/span><span style="color: #008000; "><br /></span>        sslTrustStore = "D:/ssl/clientTrust.jks";<br />        sslTrustStorePassword = "123456";<br />        eaiUrl = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";<br />    }<br /><br />    <span style="color: #0000FF; ">public</span> String sendData(String data) {<br />        String receivedData = <span style="color: #0000FF; ">null</span>;<br />        <span style="color: #0000FF; ">try</span> {<br />            <br />             System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);<br />             System.setProperty("javax.net.ssl.keyStorePassword",sslKeyStorePassword);<br />             System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);<br />            <span style="color: #008000; ">//</span><span style="color: #008000; ">讄pȝ参数</span><span style="color: #008000; "><br /></span>            System.setProperty("javax.net.ssl.trustStore", sslTrustStore);<br />            System.setProperty("javax.net.ssl.trustStorePassword",<br />                    sslTrustStorePassword);<br />            receivedData = send(eaiUrl, data);<br />        } <span style="color: #0000FF; ">catch</span> (Exception e) {<br />            e.printStackTrace();<br />        }<br />        <span style="color: #0000FF; ">return</span> receivedData;<br />    }<br /><br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">static</span> String send(String sendurl, String sendData)<br />            <span style="color: #0000FF; ">throws</span> Exception {<br />        <span style="color: #008000; ">//</span><span style="color: #008000; ">和上面一?/span><span style="color: #008000; "><br /></span>    }<br /><br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">void</span> main(String[] args) {<br />        ClientSendData t = <span style="color: #0000FF; ">new</span> ClientSendData();<br />        t.sendData("试SSL双项q接Q向服务端发送数?");<br />    }<br />}</div><br /><br /><p style="margin: 0px; padding: 0px; ">下面来说说可能会(x)遇到的异常:(x)</p><p style="margin: 0px; padding: 0px; ">1. java.security.NoSuchAlgorithmException</p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">一般来说是密钥库类型不对,如上面的sslKeyStoreType = "JKS" 却写成PKCS12?/p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">也有可能是证书的问题?/p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">2. java.net.UnknownHostException</p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">服务端地址不对?/p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">3.java.net.SocketException: Unexpected end of file from server</p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">q个异常和客L(fng)没有关系Q说明已l发送成功。是服务端的问题。有可能是防火墙的原因,也可能是服务端没处理客户端的响应?/p><p style="margin: 0px; padding: 0px; ">另外有h说当URLq长时也?x)发生此错误Q当使用URL发送数据时Q可以参考此意见?/p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">4.java.io.IOException:server returned HTTP response code :500</p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">q个异常是服务端代码的问题。服务端相应代码执行时抛Z异常?/p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; "> </p><p style="margin: 0px; padding: 0px; ">最?如果q回的状态码?00 Q表C成功?/p><br /><p> </p><p> </p><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/388389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-09-23 22:31 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/09/23/388389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Https ssl javahttp://www.aygfsteel.com/stevenjohn/archive/2012/08/23/386102.htmlabinabinThu, 23 Aug 2012 05:54:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/08/23/386102.htmlhttp://www.aygfsteel.com/stevenjohn/comments/386102.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/08/23/386102.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/386102.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/386102.htmlhttp://www.iteye.com/topic/1125183
http://blog.sina.com.cn/s/blog_5f64eccd0100p0pc.html
http://www.iteye.com/topic/1125183
http://hi.baidu.com/zhouqiugang/blog/item/65c9e160177db3cc8cb10d86.html
http://blog.csdn.net/zrbin153/article/details/6026840
HttpClient讉Khttps站点证书加蝲问题
http://237451446.blog.51cto.com/2307663/759338
http://www.aygfsteel.com/sxyx2008/archive/2011/07/08/353940.html


abin 2012-08-23 13:54 发表评论
]]>
keytool+tomcat配置HTTPS双向证书认证http://www.aygfsteel.com/stevenjohn/archive/2012/08/22/385989.htmlabinabinWed, 22 Aug 2012 01:52:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/08/22/385989.htmlhttp://www.aygfsteel.com/stevenjohn/comments/385989.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/08/22/385989.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/385989.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/385989.html

pȝ需求:(x)

1?nbsp; Windowspȝ或Linuxpȝ

2?nbsp; 安装q|JDK 1.6.0_13

3?nbsp; 安装q|Tomcat 6.0

 

W一步:(x)为服务器生成证书

1?nbsp; Windows

  • “q行”控制収ͼq入%JAVA_HOME%/bin目录
  • 使用keytool为Tomcat生成证书Q假定目标机器的域名?#8220;localhost”Qkeystore文g存放?#8220;D:\home\tomcat.keystore”Q口令ؓ(f)“password”Q用如下命令生成:(x)

 

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\home\tomcat.keystore -validity 36500

 

(参数要说明:(x)“D:\home\tomcat.keystore”含义是将证书文g的保存\径,证书文g名称是tomcat.keystore Q?#8220;-validity 36500”含义是证书有效期Q?6500表示100q_(d)默认值是90?

  • 在命令行填写必要参数Q?/span>

A、输入keystore密码Q此处需要输入大?个字W的字符?/span>

B?#8220;(zhn)的名字与姓氏是什么?”q是必填,q且必须是TOMCAT部vL的域名或者IP[如:(x)gbcom.com 或?10.1.25.251]Q就是你来要在览器中输入的访问地址Q,否则览器会(x)弹出警告H口Q提C用戯书与所在域不匹配。在本地做开发测试时Q应填入“localhost”

C?#8220;你的l织单位名称是什么?”?#8220;(zhn)的l织名称是什么?”?#8220;(zhn)所在城市或区域名称是什么?”?#8220;(zhn)所在的州或者省份名U是什么?”?#8220;该单位的两字母国家代码是什么?”可以按照需要填写也可以不填写直接回车,在系l询?#8220;正确吗?”Ӟ对照输入信息Q如果符合要求则使用键盘输入字母“y”Q否则输?#8220;n”重新填写上面的信?/span>

D、输?lt;tomcat>的主密码Q这较为重要,?x)在tomcat配置文g中用,输入与keystore的密码一_(d)讄其它密码也可?/span>

  • 完成上述输入后,直接回R则在你在W二步中定义的位|找到生成的文g

2?nbsp; Linux

  • “q行”控制収ͼq入%JAVA_HOME%/bin目录
  • 使用如下命o(h)生成Q?/span>

 

./keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/local/ac/web/tomcat.keystore -validity 36500

(参数要说明:(x)“/etc/tomcat.keystore”含义是将证书文g保存在\?usr/local/ac/web/下,证书文g名称是tomcat.keystore Q?#8220;-validity 36500”含义是证书有效期Q?6500表示100q_(d)默认值是90?

  • 在命令行填写必要参数Q?/span>

A、Enter keystore passwordQ此处需要输入大?个字W的字符?/span>

B?#8220;What is your first and last name?”q是必填,q且必须是TOMCAT部vL的域名或者IP[如:(x)gbcom.com 或?10.1.25.251]Q就是你来要在览器中输入的访问地址

C?#8220;What is the name of your organizational unit?”?#8220;What is the name of your organization?”?#8220;What is the name of your City or Locality?”?#8220;What is the name of your State or Province?”?#8220;What is the two-letter country code for this unit?”可以按照需要填写也可以不填写直接回车,在系l询?#8220;correct?”Ӟ对照输入信息Q如果符合要求则使用键盘输入字母“y”Q否则输?#8220;n”重新填写上面的信?/span>

D、Enter key password for <tomcat>Q这较为重要,?x)在tomcat配置文g中用,输入与keystore的密码一_(d)讄其它密码也可?/span>

  • 完成上述输入后,直接回R则在你在W二步中定义的位|找到生成的文g

 

W二步:(x)为客L(fng)生成证书

 

  • 为浏览器生成证书Q以便让服务器来验证它。ؓ(f)了能证书顺利导入至IE和FirefoxQ证书格式应该是PKCS12Q因此,使用如下命o(h)生成Q?/span>

 

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\home\mykey.p12

 

对应的证书库存放?#8220;D:\home\mykey.p12”Q客L(fng)的CN可以是Q意倹{双击mykey.p12文gQ即可将证书导入x览器Q客L(fng)Q?/span>

 

W三步:(x)让服务器信Q客户端证?/strong>

 

  • ׃是双向SSL认证Q服务器必须要信dL(fng)证书Q因此,必须把客L(fng)证书d为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入Q必d把客L(fng)证书导出Z个单独的CER文gQ用如下命令:(x)

 

keytool -export -alias mykey -keystore D:\home\mykey.p12 -storetype PKCS12 -storepass password -rfc -file D:\home\mykey.cer

 

  • 通过以上命o(h)Q客L(fng)证书p我们导出?#8220;D:\home\mykey.cer”文g了。下一步,是将该文件导入到服务器的证书库,dZ个信任证书:(x)

 

keytool -import -v -file D:\home\mykey.cer -keystore D:\home\tomcat.keystore

 

  • 通过list命o(h)查看服务器的证书库,可以看到两个证书Q一个是服务器证书,一个是受信ȝ客户端证书:(x)

 

keytool -list -keystore D:\home\tomcat.keystore

 

W四步:(x)让客L(fng)信Q服务器证?/strong>

 

  • ׃是双向SSL认证Q客L(fng)也要验证服务器证书,因此Q必L服务器证书添加到览?#8220;受信ȝ根证书颁发机?#8221;。由于不能直接将keystore格式的证书库导入Q必d把服务器证书导出Z个单独的CER文gQ用如下命令:(x)

 

keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer

 

 

  • 通过以上命o(h)Q服务器证书p我们导出?#8220;D:\home\tomcat.cer”文g了。双击tomcat.cer文gQ按照提C安装证书,证书填入到“受信ȝ根证书颁发机?#8221;?/span>

W四步:(x)配置Tomcat服务?/strong>

 

打开Tomcat根目录下?conf/server.xmlQ找到如下配|段Q修改如下:(x)

 

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https"
secure="true" clientAuth="true" sslProtocol="TLS"
keystoreFile="D:\\home\\test.keystore" keystorePass="123456"
truststoreFile="D:\\home\\test.keystore" truststorePass="123456" />

属性说明:(x)

  • clientAuth:讄是否双向验证Q默认ؓ(f)falseQ设|ؓ(f)true代表双向验证
  • keystoreFile:服务器证书文件\?/span>
  • keystorePass:服务器证书密?/span>
  • truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
  • truststorePass:根证书密?/span>

W五步:(x)试

 

在浏览器中输?https://localhost:8443/Q会(x)弹出选择客户端证书界面,点击“定”Q会(x)q入tomcat主页Q地址栏后?x)?#8220;?#8221;图标Q表C本ơ会(x)话已l通过HTTPS双向验证Q接下来的会(x)话过E中所传输的信息都已经qSSL信息加密?br />

注意事项Q貌似导入证书的时候,最好导入到“个h”那一栏里面,貌似客户端的用户名不填写也是可以的,或者随便填写?br />
http://licg1234.blog.163.com/blog/static/13908233320121165356868/ 


 



abin 2012-08-22 09:52 发表评论
]]>
վ֩ģ壺 | | | | | | | | | | ͬ| | ۽| ɽ| ߷| Ž| Ͱ| | ɽ| | ɽ| | ϴ| ¡| | ͩ®| ϲ| Ͱ| ƽ| ³ľ| | Ұ| | | | ǰ| | | | | IJ|