`
whui0110
  • 浏览: 84227 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用httpClient访问https+443(转)

 
阅读更多

首先是服务端如何支持https的问题,步骤如下。
1、生成服务端证书,cmd命令:
keytool -genkey -alias tomcat -keyalg RSA
或者
keytool -genkey -alias jboss -keyalg RSA
按照提示输入一些信息,如果是本机调试,用户名最好输入localhost,否则会出现不匹配异常。
完成后,系统默认把文件放在我的文档里面,名字默认是.keystore。
把文件复制到jboss-5.1.0.GA\server\default\conf下面。
2、在jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\打开server.xml,找到如下:
<!-- SSL/TLS Connector configuration using the admin devl guide keystore-->
      <Connector protocol="HTTP/1.1" SSLEnabled="true"
           port="443" address="${jboss.bind.address}"
           scheme="https" secure="true" clientAuth="false"
           keystoreFile="${jboss.server.home.dir}/conf/.keystore"
           keystorePass="123456" sslProtocol = "TLS" />
jboss默认有这些,但是注释了,如果没有就添加进去。需要注意下面几个属性值:
port是端口号,默认是8443。
keystoreFile="${jboss.server.home.dir}/conf/.keystore"是keystore文件路径。keystorePass是提示中输入的密码。
3、将系统部署后,启动,浏览器中输入https://localhost:443/projectName
理论上会提示证书不安全,点通过、继续、忽略之类的一个提示,就可以访问了。
同时不影响原来的http://localhost:8080/projectName访问。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后是使用httpClient如何访问的问题。
使用https访问时,需要证书验证的。https也是通过证书验证的方式使的所提供的服务更具有安全性。上面的浏览器能够直接访问,是因为浏览器能够自动处理证书的问题,使用httpClient访问https时,只能人为的去处理证书了。有两种方式。
一、第一个是通过浏览器导出证书.cer文件,导入到在httpClient所运行的jdk中,jdk信任该证书后,就可以访问了。
二、将服务端的.keystore文件拿到客户端,程序中通过下面两行来手动信任该证书。
System.setProperty("javax.net.ssl.trustStore", "D:/B/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","123456");;
~~~~~~~~~~~~~~~~~~
第二种方式只能用于自身调试,因为在系统实际运行中,客户端不可能实时的去拿服务端的.keystore文件。详细介绍一下第一种方式。
1、通过浏览器导出证书。
在浏览器中输入https://localhost:443/projectName,根据提示导出证书。
操作过程中,发现ie8找不到导出的按钮,我用的是filefox,输入地址后,会看到证书不信任提示,按照提示一步步导出,“添加例外——查看——详细信息——导出”,保存类型选择“X509含链证书(PEM)”,即后缀为.crt
打开crt文件,选择“详细信息——复制到文件——一顿下一步”,生成.cer文件。
2、将证书导入到jdk中。
cmd中进入到jdk1.6.0_21\jre\lib\security文件夹中,命令:
keytool -import -noprompt -keystore cacerts -storepass changeit -alias zhy0105 -file D:/B/abcd.cer
提示输入密码时,密码输入:changeit
zhy0105是自定义名称,最后是证书cer文件的全路径。操作成功后会提示:“认证已添加至keystore中”。
3、注意问题。
(1)第一步会因为浏览器的不同和版本不同会有所偏差,上面这个过程只是针对于firefox,还不知道点几。据说有的浏览器可以直接导出.cer文件。
(2)注意jdk的路径:jdk1.6.0_21\jre\lib\security,是jdk下面的jre,不是和jdk平级的那个jre文件夹。别搞错了...
(3)一定要保证导入证书的jdk就是myeclipse中所配置的jdk,myeclipse中默认的jdk是它本身自带的。
如果在myeclipse中用本身自带的jdk运行httpClient,导入证书的jdk是自己安装的。运行肯定会报错,异常我贴在最下面。证书导入成功,httpClient还是访问不了https,这个问题困扰了我三天。
(4)Window7中,如果jdk安装在了c盘,系统默认是不允许修改文件的,cmd中导入证书时会提示拒绝访问,需要在文件夹中的文件属性里面修改一下权限,在执行就可以了。
~~~~~~~~~~~~~~~~~~~~~~~
以上问题处理完后,程序中就直接按照平时访问http的代码来写就可以了。
贴个以post方式访问并且带附件上传的样例

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.log4j.Logger;

public class HttpsUtils {
	private static final Logger log = Logger.getLogger(HttpsUtils.class);

	public static void main(String[] args) throws FileNotFoundException {
		String reqURL = "https://xpa-ag.huawei.com/Service/LoginServlet2.jsp";
		Map<String, String> params = new HashMap<String, String>();
		params.put("uid", "03B70CC19E8595F568DC950A1D2BD128");
		params.put("password", "3301CC07C2E136070E3FAC012A132109");
		sendSSLPostRequest(reqURL, params);
	}

	public static String sendSSLPostRequest(String reqURL, Map<String, String> params) {
		String result = null;

		HttpClient httpClient = new HttpClient();
		PostMethod method = new PostMethod(reqURL);

		Part[] parts = new Part[params.size()];
		Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
		int i = 0;
		while (it.hasNext()) {
			Map.Entry<String, String> entry = it.next();
			parts[i++] = new StringPart(entry.getKey(), entry.getValue());
		}
		method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
		// 使用系统提供的默认的恢复策略
		method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
		try {
			// 执行method
			int statusCode = httpClient.executeMethod(method);
			if (statusCode != HttpStatus.SC_OK) {
				System.err.println("Method failed: " + method.getStatusLine());
			}
			// 读取内容
			byte[] responseBody = method.getResponseBody();
			// 处理内容
			result = new String(responseBody);
			System.out.println(result);
		} catch (HttpException e) {
			// 发生致命的异常,可能是协议不对或者返回的内容有问题
			log.error(e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			// 发生网络异常
			log.error(e.getMessage());
			e.printStackTrace();
		} finally {
			// 释放连接
			method.releaseConnection();
		}
		return result;
	}
}

 另外,如果系统测试所部署的服务器是linux,和开发环境中还有中转服务器的话,把下面这一行放在httpClient对象定义之后就行了。
httpClient.getHostConfiguration().setProxy("10.100.XX.XXX",8080);

 

 

转自:http://from-null.iteye.com/blog/859795

分享到:
评论

相关推荐

    使用httpClient访问https+443端口号。

    标题中的“使用httpClient访问https+443端口号”指的是使用Apache HttpClient库来发起HTTPS(安全超文本传输协议)请求,目标服务器的默认端口是443。HTTPS是一种基于SSL/TLS的安全通信协议,用于在客户端和服务器...

    使用httpclient访问servlet

    总之,使用HttpClient访问Servlet能够简化Java应用之间的通信,特别是在分布式系统中。正确理解和应用HttpClient的各种特性和配置,能够帮助我们构建高效、可靠的网络通信方案。在实际开发中,还需要根据具体项目...

    android HttpClient访问Https

    android HttpClient访问某些Https时,出现了问题,无法访问,好像是要安全验证。此Demo解决了此问题,HttpClient能够Https和Http类型的URL了。 在eclipse下打开工程若有乱码,请把eclipse的字符编码改成UTF-8。

    Android使用HttpClient和HttpsUrlConnection两种方式访问https网站

    #### 1.1 配置HttpClient访问HTTPS(不验证证书) ```java // 创建HttpClient实例 HttpClient httpClient = new DefaultHttpClient(); // 创建HttpGet请求 HttpGet httpGet = new HttpGet("https://example.com");...

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

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

    httpclient来进行https访问

    根据提供的文件信息,我们可以深入探讨如何使用`httpclient`库来进行`https`访问,并了解其中涉及的关键概念和技术细节。 ### 标题与描述解析:使用`httpclient`进行`https`访问 #### 1. `httpclient`简介 `...

    HttpClient之Https应用实例

    HttpClient之Https应用实例~ 包含: HttpClient 使用代理访问Https HttpClient 信任所有主机-对于任何证书都不做检查 HttpClient 允许所有证书的校验(包括过期证书)

    httpclient4.5发送https请求(验证证书)

    不会的可以在评论区留言哈,这是我自己做项目用到的。所以绝对可用!同时共享出来给到大家

    httpclient4.1访问https的配置方法

    【标题】:“httpclient4.1访问https的配置方法” 【描述】:“本教程将指导你如何利用Apache HttpClient 4.1实现对HTTPS服务的访问,首先需要在Tomcat服务器上配置SSL支持。我们将涵盖SSL证书的生成、Tomcat服务器...

    httpclient-4.3.3+jsoup-1.7.3模拟登陆csdn

    本项目涉及的是使用Apache HttpClient 4.3.3和Jsoup 1.7.3这两个开源库来实现对CSDN(China Software Developer Network)网站的模拟登录,并在成功登录后抓取用户的个人主页内容。下面将详细阐述这两个库的功能以及...

    httpclient访问需要客户端认证数字证书的https接口的处理方法

    本篇文章将深入探讨如何使用HttpClient来处理这种情况。 HttpClient是一个强大的Java库,用于执行HTTP请求。然而,当遇到需要客户端证书的HTTPS接口时,普通的配置可能无法工作,因为默认情况下HttpClient不会携带...

    简单的httpClient访问

    这篇名为“简单的httpClient访问”的博文可能是介绍如何使用HttpClient进行基础的HTTP请求。HttpClient库提供了丰富的功能,包括GET、POST请求,设置请求头,处理响应,以及支持HTTPS等。接下来,我们将深入探讨...

    爬虫:httpclient+jsoup

    - 使用HttpClient获取原始HTML源码,避免Jsoup直接访问网页可能遇到的JavaScript执行问题。 - 将HttpClient获取的HTML内容传递给Jsoup进行解析,提取所需数据。 - 这种方式适合处理包含复杂JavaScript渲染的页面...

    HttpClient代理访问网络

    HttpClient代理访问网络

    JAVA利用HttpClient进行HTTPS接口调用的方法

    Java中使用HttpClient进行HTTPS接口调用的方法是通过继承DefaultHttpClient类,忽略证书校验过程。首先,创建一个SSLClient类,继承DefaultHttpClient类,并在构造函数中初始化SSLContext和TrustManager。然后,使用...

    Android使用Apache的HttpClient访问微Web站点

    本实例描述了Android平台下使用Apache开源项目的HttpClient访问网络的示例。分别使用HttpClient下的两个子实现类,DefaultHttpClient和AndroidHttpClient分别进行演示。

    使用HttpClient下载图片

    HttpClient是个很不错的开源框架(org.appache.http),封装了访问http的请求头,参数,内容体,响应等等,使用起来更方面更强大。 HttpURLConnection是java的标准类,可以实现简单的基于URL请求、响应功能,什么都...

    使用httpclient方式和RestTemplate方式调用http及https接口

    本主题将深入探讨如何使用HttpClient和Spring的RestTemplate工具来实现这一目标。这两种方法都是可靠的,但在不同场景下各有优缺点。 首先,让我们了解HTTP和HTTPS的基本概念。HTTP(超文本传输协议)是用于在Web上...

    jsoup+httpclient+jar包

    HttpClient与JSoup结合使用,可以实现更高级的网页访问和数据获取。 **结合使用JSoup和HTTPClient** 将JSoup与HTTPClient结合,可以创建一个高效且灵活的网页爬虫。首先,HTTPClient负责发起HTTP请求,获取网页的...

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

    - **创建HttpClient实例**:首先,我们需要创建一个HttpClient对象,例如使用`HttpClientBuilder`或`HttpClients.createDefault()`方法。 - **构建HttpGet请求**:使用`HttpGet`类创建一个HTTP GET请求,指定要...

Global site tag (gtag.js) - Google Analytics