`

(转)使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL

阅读更多
package com.jadyer.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

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.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
 * 使用HttpClient模拟HTTPS访问
 * @see ===================================================================================================================================
 * @see 【配置Tomcat支持SSL(即让Tomcat下的Web应用处于SSL安全通道中)】
 * @see ===================================================================================================================================
 * @see 1、生成KeyStore
 * @see    1)运行-->CMD-->"keytool -genkey -alias Jadyer_SSL_20120508 -keyalg RSA -validity 1024 -keystore D:\Jadyer_SSL_20120508.keystore"
 * @see      参数说明----->-genkey  表示生成密钥
 * @see                   -alias    指定别名,这里是Jadyer_SSL_20120508
 * @see                   -keyalg   指定算法,这里是RSA
 * @see                   -validity 指定证书有效期,这里是1024天
 * @see                   -keystore 指定存储位置,这里是D:\\Jadyer_SSL_20120508.keystore
 * @see    2)CMD输出----->输入keystore密码:hongyu75
 * @see                   再次输入新密码:hongyu75
 * @see                   您的名字与姓氏是什么?[Unknown]:127.0.0.1(这里要根据实际情况填写网站域名或者IP,否则会出现证书上的名称无效)
 * @see                   您的组织单位名称是什么?[Unknown]:http://blog.csdn.net/jadyer
 * @see                   您的组织名称是什么?[Unknown]:JavaLover_jadyer
 * @see                   您所在的城市或区域名称是什么?[Unknown]:BJ
 * @see                   您所在的州或省份名称是什么?[Unknown]:BJ_NanTian
 * @see                   该单位的两字母国家代码是什么[Unknown]:CN
 * @see                   CN=127.0.0.1, OU=http://blog.csdn.net/jadyer, O=JavaLover_jadyer, L=BJ, ST=BJ_NanTian, C=CN 正确吗?[否]:Y
 * @see                   输入<Jadyer_SSL_20120508>的主密码(如果和 keystore 密码相同,按回车):这里按回车键
 * @see                   (这里的主密码一定要与keystore密码相同,否则启动Tomcat时就会告诉你java.io.IOException: Cannot recover key)
 * @see    3)接下来就会按照-keystore参数值在指定位置生成指定的KeyStore文件了
 * @see ===================================================================================================================================
 * @see 2、让Tomcat支持SSL
 * @see    1)将生成的Jadyer_SSL_20120508.keystore拷贝到\\%TOMCAT_HOME%\\conf\\目录中(其它目录也可以)
 * @see    2)修改\\%TOMCAT_HOME%\\conf\\server.xml文件(大约在85行的位置),新增内容如下
 * @see      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
 * @see                 maxThreads="150" scheme="https" secure="true"
 * @see                 clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"
 * @see                 keystoreFile="conf/Jadyer_SSL_20120508.keystore" keystorePass="hongyu75"/>
 * @see    3)这样,我们的Tomcat就支持HTTPS访问了(关于<Connector/>标签中的属性说明,参拜Google大神)
 * @see ===================================================================================================================================
 * @see 3、用浏览器访问我们的应用
 * @see   1)输入https://127.0.0.1:8443/blog会发现你的应用已经处于SSL安全通道中了
 * @see     此时,如果我们在浏览器里访问http://127.0.0.1:8443/blog会发现,竟然能访问
 * @see     也就是说,我们虽然启用了HTTPS,但现在还可以绕开HTTPS直接访问HTTP还能,这样HTTPS也就起不到作用了
 * @see   2)我们可以配置一下\\%TOMCAT_HOME%\\conf\\web.xml文件,使得HTTP的访问能够重定向到HTTPS的连接
 * @see     修改位置大约为web.xml的1224行,即在</welcome-file-list>标签后面加入下面的内容,即可
 * @see     <security-constraint>
 * @see     	<!-- Authorization setting for SSL -->
 * @see     	<web-resource-collection>
 * @see     		<web-resource-name>SSL_App</web-resource-name>
 * @see     		<!-- 指明需要SSL的url -->
 * @see     		<url-pattern>/*</url-pattern>
 * @see     		<http-method>GET</http-method>
 * @see     		<http-method>POST</http-method>
 * @see     	</web-resource-collection>
 * @see     	<user-data-constraint>
 * @see     		<!-- 指明需要SSL -->
 * @see     		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
 * @see     	</user-data-constraint>
 * @see     </security-constraint>
 * @see ===================================================================================================================================
 * @author http://blog.csdn.net/jadyer
 * @editor Feb 1, 2012 3:02:27 PM
 */
public class HttpClientUtil {
	public static void main(String[] args)throws Exception{
		//String requestUrl = "http://127.0.0.1:8088/test/web/userac";
		String requestUrl = "https://127.0.0.1:8443/test/web/userac";
		System.out.println(sendSSLRequest(requestUrl));
	}
	
	/**
	 * 发送HTTPS请求
	 * @param requestUrl 请求的地址
	 * @return 响应内容
	 */
	@SuppressWarnings("finally")
	public static String sendSSLRequest(String requestUrl){
		long responseLength = 0;       //响应长度
		String responseContent = null; //响应内容
		HttpClient httpClient = new DefaultHttpClient(); //创建默认的httpClient实例
		try {
			KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
			FileInputStream fis = new FileInputStream(new File("F:\\Tool\\IDE\\Jadyer_SSL_20120508.keystore"));
			try {
				trustStore.load(fis, "hongyu75".toCharArray()); //加载KeyStore
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (CertificateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);   //创建Socket工厂,将trustStore注入
			Scheme sch = new Scheme("https", 8443, socketFactory);               //创建Scheme
			httpClient.getConnectionManager().getSchemeRegistry().register(sch); //注册Scheme
			HttpGet httpGet = new HttpGet(requestUrl);           //创建HttpGet
			HttpResponse response = httpClient.execute(httpGet); //执行GET请求
			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("请求地址: " + httpGet.getURI());
			System.out.println("响应状态: " + response.getStatusLine());
			System.out.println("响应长度: " + responseLength);
			System.out.println("响应内容: " + responseContent);
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (UnrecoverableKeyException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpClient.getConnectionManager().shutdown(); //关闭连接,释放资源
			return responseContent;
		}
	}
}

 

分享到:
评论

相关推荐

    httpclient4.1访问https的配置方法

    我们将涵盖SSL证书的生成、Tomcat服务器的SSL配置以及HttpClient的使用。” 【标签】:“httpclient4.1 https ssl” 【正文】: 在现代的互联网环境中,安全的通信协议是至关重要的。HTTPS(HTTP over SSL/TLS)...

    配置tomcat服务器支持SSL

    配置 Tomcat 服务器支持 SSL 配置 Tomcat 服务器支持 SSL 是为了开启 Tomcat 的安全认证通道,从而确保数据的安全传输。在某些项目中,可能需要使用 SSL 加密来保护数据的安全。 首先,需要准备好生成的证书...

    使用httpclient访问servlet

    使用HttpClient的`execute(HttpUriRequest request)`方法发送请求。这个方法会返回一个`HttpResponse`对象,其中包含了服务器的响应。 5. **处理响应**: 从`HttpResponse`中获取状态码(`getStatusLine()....

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

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

    httpClient4.1入门教程.

    4) 用 httpClient 访问 https:配置 HttpClient 使用 SSL,设置信任的 KeyStore 和相关安全参数,然后发送 HTTPS 请求。 教程版本说明 该教程的初始版本为 0.9,由作者 wanghe 编写。内容包括了基本的 HttpClient...

    httpClient4.1入门教程.pdf

    最后,文档还演示了如何使用HttpClient访问HTTPS协议的站点,包括生成KeyStore以及配置Tomcat服务器支持SSL的方法,并指导用户如何通过浏览器和HttpClient访问经过SSL加密的应用。 整体而言,本教程深入浅出地介绍...

    httpclient-4.2.5 相关jar包

    3. 使用HttpClient实例的execute方法发送请求。 4. 处理响应,例如获取响应状态码、读取响应体等。 HttpClient 4.2.5还引入了一些优化和修复,提高了性能和稳定性,比如更好的连接管理、错误处理机制的改进以及对...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...

    HttpClient使用教程

    - 用 HttpClient 访问 HTTPS:配置 HttpClient 实例使用 SSLContext 和 TrustStrategy,允许信任所有证书,然后执行 HTTPS 请求。 教程版本说明: 该教程基于 HttpClient 4.1 版本,包括基础用法和 SSL 访问的...

    HttpClient SSL Tomcat和Eclipse

    对于HTTPS的支持,HttpClient可以配置为通过SSL连接与服务器交互,这使得它能够在需要安全通信的场景下使用。 在Eclipse中配置HttpClient与SSL服务的步骤如下: 1. **导入HttpClient库**:首先,你需要在Eclipse...

    httpClient4.1入门教程.docx

    6. **HttpClient 连接 SSL**:配置 SSL 需要生成 KeyStore,配置 Tomcat 服务器支持 SSL,然后在 HttpClient 中设置 SSLContext 和 SchemeRegistry。 通过上述步骤,开发者可以快速上手使用 HttpClient 实现各种 ...

    httpClient4.1入门教程

    HttpClient支持HTTPS协议,但需要进行一些额外的配置,如生成KeyStore和配置服务器支持SSL。 #### 1) 生成KeyStore 可以使用Java的keytool工具生成KeyStore文件,然后设置相关的密码。 #### 2) 配置Tomcat服务器...

    apache-tomcat-源码-lib包

    5. **部署和配置**:Tomcat支持多种方式部署Web应用,如WAR文件、目录结构或者通过管理接口。源码中,你可以看到这些部署过程的细节,如`org.apache.catalina.startup.ContextConfig`和`org.apache.catalina.startup...

    apache-tomcat-5.5.30

    7. **安全管理**:Tomcat支持多种安全机制,包括基本认证、摘要认证、SSL/TLS加密以及角色和权限的管理,这些都是通过`conf/server.xml`和`conf/web.xml`中的配置来实现的。 8. **性能优化**:Tomcat可以通过调整...

    tomcat源码编译所需jar包

    《深入解析Tomcat源码编译所需jar包》 Tomcat作为一款广泛应用的开源Web服务器和Servlet容器,其源码的...正确配置和使用这些jar包,将有助于我们更好地掌握Tomcat的内部机制,从而优化应用性能和解决可能出现的问题。

    绿色tomcat

    4. **安全性增强**:包括SSL/TLS配置的改进,以及对最新的加密算法的支持。 5. **管理工具**:Tomcat 6.0包含了用于管理和监控服务器的工具,如`manager`和`admin`应用,可以通过Web界面操作。 尽管Tomcat 6.0已经...

    C# https交互自动导入证书源代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这段代码主要实现了C#环境下通过HTTPS协议进行数据交互,...此外,考虑到 `XMLHTTP` 类的过时性和潜在的安全问题,建议使用更现代的库如 `HttpClient` 进行开发。

Global site tag (gtag.js) - Google Analytics