`

java tomcat 搭建SSL双向认证以及httpclient 代码

阅读更多
最近一直在尝试搭建apache+tomcat的单向认证ssl环境。网上看了很多令我眼花缭乱的资料。先开始用mod_jk的方式始终不能成功。后来还是用mod_proxy方式来实现。但这种方式貌似性能不是太好,这里如果有朋友知道确实可行的资料。可以告诉小弟一声。
然后又开始研究apache+tomcat的双向认证环境。没找到apache+tomcat的解决方案。倒是找到只是基于tomcat的双向认证方案。经我认证是可行的。。在此要谢谢原创作者。

Java Tomcat SSL 服务端/客户端双向认证(一)
Java Tomcat SSL 服务端/客户端双向认证のApache HttpClient(二)

另外附一下httpclient发送http请求、发送https单向认证请求、发送https双向请求代码
我用的httpClient版本是4.2.2,低版本的可能不支持。建议大家大家去官网下载一个完整的发行包
package com.cntaiping.clm.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
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.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpClientUtils {
	private static Log log=LogFactory.getLog(HttpClientUtils.class);
	private static final String KEY_STORE_TYPE_JKS = "jks";
    private static final String KEY_STORE_TYPE_P12 = "PKCS12";
    private static final String SCHEME_HTTPS = "https";
    private static final int HTTPS_PORT = 8443;
    private static final String HTTPS_URL = "https://127.0.0.1:8443/TestDemo/sslServlet";
    private static final String KEY_STORE_CLIENT_PATH = "D:/key/client.p12";
    private static final String KEY_STORE_TRUST_PATH = "D:/key/client.truststore";
    private static final String KEY_STORE_PASSWORD = "aaaaaa";
    private static final String KEY_STORE_TRUST_PASSWORD = "aaaaaa";
    
    /**
	 * 使用httpClient 发出http请求
	 * 均为POST请求
	 * @param url
	 * @param xmlStr
	 * @return
	 */
	public static String  httpClient(String url,String xmlStr) {
		String returnStr="";
		HttpClient client = new DefaultHttpClient();
		HttpPost post=new HttpPost(url);
		post.setHeader("content-type", "text/xml; charset=UTF-8");
		StringEntity strEntity;
		try {
			strEntity = new StringEntity(xmlStr, "UTF-8");
			post.setEntity(strEntity);
			HttpResponse response = client.execute(post);
			HttpEntity entity = response.getEntity();
			if(null!=entity){
				BufferedReader reader=new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
				StringBuffer buff=new StringBuffer();
				while((returnStr=reader.readLine())!=null){
					buff.append(returnStr);
				}
				returnStr=buff.toString();
//				returnStr=EntityUtils.toString(entity);
				log.info("returnStr:"+returnStr);
				post.abort();
				
				if(response != null) {
					Header headers[] = response.getAllHeaders();
					int i = 0;
					while (i < headers.length) {
						log.debug(headers[i].getName() + ":  "+ headers[i].getValue());
						i++;
					}
				}
			}
		} catch (UnsupportedEncodingException e) {
			log.info("程序出错:"+e.getMessage());
		} catch (ClientProtocolException e) {
			log.info("程序出错:"+e.getMessage());
		} catch (IOException e) {
			log.info("程序出错:"+e.getMessage());
		}finally{
			client.getConnectionManager().shutdown();
		}
		
		return returnStr;
	}
	
	/**
	 * 发送https请求
	 * 为单向请求
	 * @param url
	 * @param xmlStr
	 * @return
	 */
	public static String httpsClient(String url,String xmlStr) {
		long responseLength = 0;                         //响应长度  
        String responseContent = "";                     //响应内容  
        HttpClient httpClient = new DefaultHttpClient(); //创建默认的httpClient实例  
        X509TrustManager xtm = new X509TrustManager(){   //创建TrustManager  
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}  
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}  
            public X509Certificate[] getAcceptedIssuers() { 
            	return null;   //return new java.security.cert.X509Certificate[0];  
            }
        };  
        try {  
            //TLS1.0与SSL3.0基本上没有太大的差别,可粗略理解为TLS是SSL的继承者,但它们使用的是相同的SSLContext  
            SSLContext ctx = SSLContext.getInstance("TLS");  
              
            //使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用  
            ctx.init(null, new TrustManager[]{xtm}, null);  
              
            //创建SSLSocketFactory  
            SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);  
              
            //通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上  
            httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));  
              
            HttpPost httpPost = new HttpPost(url);                        //创建HttpPost  
//            List<NameValuePair> formParams = new ArrayList<NameValuePair>(); //构建POST请求的表单参数  
//            for(Map.Entry<String,String> entry : params.entrySet()){  
//                formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
//            }  
            httpPost.setEntity(new StringEntity(xmlStr, "UTF-8"));  
              
            HttpResponse response = httpClient.execute(httpPost); //执行POST请求  
            HttpEntity entity = response.getEntity();             //获取响应实体  
              
            if (null != entity) {  
                responseLength = entity.getContentLength();  
                responseContent = EntityUtils.toString(entity, "UTF-8");  
                EntityUtils.consume(entity); //Consume response content  
            }  
            System.out.println("请求地址: " + httpPost.getURI());  
            System.out.println("响应状态: " + response.getStatusLine());  
            System.out.println("响应长度: " + responseLength);  
            System.out.println("响应内容: " + responseContent);  
        } catch (KeyManagementException e) {  
            e.printStackTrace();  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  
        } catch (ParseException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            httpClient.getConnectionManager().shutdown(); //关闭连接,释放资源  
        }
        return responseContent;
	}
	
	/**
	 * 发送https请求
	 * 为双向请求
	 * @param url
	 * @param xmlStr
	 * @return
	 */
	private static void ssl() throws Exception {
        HttpClient httpClient = new DefaultHttpClient();
        try {
            KeyStore keyStore  = KeyStore.getInstance(KEY_STORE_TYPE_P12);
            KeyStore trustStore  = KeyStore.getInstance(KEY_STORE_TYPE_JKS);
            InputStream ksIn = new FileInputStream(KEY_STORE_CLIENT_PATH);
            InputStream tsIn = new FileInputStream(new File(KEY_STORE_TRUST_PATH));
            try {
                keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray());
                trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray());
            } finally {
                try { ksIn.close(); } catch (Exception ignore) {}
                try { tsIn.close(); } catch (Exception ignore) {}
            }
            SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, KEY_STORE_PASSWORD, trustStore);
            Scheme sch = new Scheme(SCHEME_HTTPS, HTTPS_PORT, socketFactory);
            httpClient.getConnectionManager().getSchemeRegistry().register(sch);
            HttpGet httpget = new HttpGet(HTTPS_URL);
            System.out.println("executing request" + httpget.getRequestLine());
            HttpResponse response = httpClient.execute(httpget);
            HttpEntity entity = response.getEntity();
            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
                String text;
                while ((text = bufferedReader.readLine()) != null) {
                    System.out.println(text);
                }
                bufferedReader.close();
            }
            EntityUtils.consume(entity);
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }
}

分享到:
评论
2 楼 繁星水 2015-11-02  
感谢分享  
1 楼 zhanshg 2015-08-07  
非常感谢楼主的分享,对我很有帮助!  

相关推荐

    基于Tomcat搭建SSL双向认证示例【100012422】

    本示例将深入探讨如何使用Tomcat搭建SSL(Secure Socket Layer)双向认证环境,以及通过Java原生类库SSLSocket进行编程,以及使用Apache的Httpclient库模拟安全的客户端请求。以下是对这些知识点的详细讲解。 首先...

    AndroidHttpClient访问Tomcat双向SSL验证服务器.pdf

    ### AndroidHttpClient访问Tomcat双向SSL验证服务器 #### 环境与背景介绍 本文主要讨论如何使用`AndroidHttpClient`访问`Tomcat`双向SSL验证服务器的相关技术和实施步骤。本项目的目标是在`Android WebView`上成功...

    java17 https 忽略ssl认证, httpclient5 ,springboot3.2.7 脚手架

    springboot3.2.7 基于java17 ,测试https 接口,基于 RestTemplate 实现

    httpclient4.5 绕过ssl认证文件访问

    本篇文章将详细讲解如何在HTTPClient 4.5版本中绕过SSL(Secure Sockets Layer)认证,实现对HTTPS网站的访问。 首先,了解SSL/TLS(Transport Layer Security)协议的重要性。SSL/TLS是网络安全传输的标准,它通过...

    httpClient实例httpClient调用 http/https实例 忽略SSL验证

    这个实例主要涉及如何配置HttpClient来忽略SSL(Secure Socket Layer)验证,这对于在开发和测试环境中处理自签名证书或未认证的服务器非常有用。以下将详细介绍HttpClient的使用以及如何进行SSL验证的忽略。 首先...

    HttpClient4.5 实现https忽略SSL证书验证

    使用HttpClient4.5实现https请求忽略SSL证书验证工具类

    android访问自签CA的Https SSL双向认证(j2SE也能使用)

    本篇文章将深入探讨如何在Android应用中实现对自签CA的HTTPS SSL双向认证,并且这些实现方法同样适用于Java SE(J2SE)环境。 首先,我们需要了解HTTPS的基本原理。HTTPS是HTTP协议的安全版本,它通过SSL/TLS协议来...

    JAVA利用HttpClient进行HTTPS接口调用

    总的来说,使用Java的HttpClient进行HTTPS接口调用涉及到配置SSL上下文、初始化HttpClient、创建请求对象以及处理响应。了解这些知识点对于开发安全的、能够与HTTPS服务进行通信的Java应用程序至关重要。通过实践和...

    java,HttpClient模拟上传,绕过SSL认证

    接下来,我们需要创建一个HttpClient实例,同时配置它跳过SSL认证。这可以通过自定义`SSLContext`和`TrustStrategy`实现: ```java import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import ...

    http远程接口调用-httpClient+跳过SSL证书校验

    在IT行业中,网络通信是应用程序之间交互的重要方式。...在apitest文件中,你可以找到包含HttpClient工具类代码,包括专门用于跳过SSL证书校验的工具类,这些代码可以作为参考,帮助你在实际项目中实现类似功能。

    java SSL HttpClient

    java SSL HttpClient。java 通过ssl去访问服务器(tomcat)

    Java 使用HttpClient保持SESSION状态

    下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,我们需要导入必要的Apache HttpClient库,通常包含以下依赖: ```xml &lt;groupId&gt;org.apache.httpcomponents &lt;artifactId&gt;httpclient ...

    java代码-使用java解决HttpClientUtil的源代码

    java代码-使用java解决HttpClientUtil的源代码 ——学习参考资料:仅用于个人学习使用!

    c++ HttpClient 最新代码

    c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient 最新代码c++ HttpClient ...

    JAVA httpclient jar下载

    httpclient常用封装工具 doGet(String url, Map, String&gt; param) doPost(String url, Map, String&gt; param) doPostJson(String url, String json)

    java使用HttpClient通过url下载文件到本地

    HttpClient是一个Java库,支持HTTP/1.1协议以及部分HTTP/2特性。它提供了一组高级API,用于处理HTTP请求和响应,包括重试、连接管理、超时设置等。对于网络编程,HttpClient是一个高效且灵活的选择。 2. **Eclipse...

    (完整版)JAVA利用HttpClient进行POST请求(HTTPS).doc

    1. JAVA HttpClient库的使用 2. HTTPS协议的使用 3. SSL/TLS证书的使用 4. X509TrustManager的使用 5. DefaultHttpClient类的使用 6. HttpClient的自定义 7. POST请求的发送 8. 请求头和请求体的指定 9. HTTPS服务器...

    httpclient代码

    该文件是httpclient的源代码,java类型的

    java httpclient 模拟登录

    在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站的过程,获取登录后的session信息,以便后续能够访问登录后才能看到的页面内容。以下将详细介绍如何使用Java HttpClient进行...

    java 访问 wcf 示例(使用的HttpClient)

    本示例将重点讲解如何使用Java的HttpClient库来调用WCF服务。 一、WCF服务基础 WCF是.NET Framework的一部分,它提供了丰富的功能来创建高度可配置、安全、可靠、事务性的网络服务。WCF服务可以通过多种协议(如...

Global site tag (gtag.js) - Google Analytics