- 浏览: 1076774 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyfeifei66:
list<bean> bean 中有 list&l ...
freemarker中的list -
BelloVersion:
第五种错误Remote host closed connect ...
客户端如何使用httpclient向https服务器发送数据 -
willxue:
看了半天 前面说的是错的?。。。
反向键索引的原理和用途 -
liulanghan110:
quainter 写道麻烦博主,参数为数组时,paramete ...
MYBATIS 的parameter -
quainter:
麻烦博主,参数为数组时,parameterType怎么写啊?
MYBATIS 的parameter
异常信息如下:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
原因:服务器的证书不被信任。一般是这样造成的。
使用KEYTOOL工具创建证书,然后用TOMCAT启动后,在浏览器打开网站时,会出现证书不被信任的提示。当然,利用HTTPCLIENT向服务端HTTPS发送数据时,HTTPCLIENT也会检测服务端的证书是否被信任,不被信任就抛出上面的异常。
解决办法有两种,一种是使证书被客户端信任。另一种是使用HTTPCLIENT发送数据时不检测服务器证书是否可信。
第一种办法,使证书被信任。
找正规CA签发证书,或者自己签发证书(只能那一台客户机上可信)。找正规CA签发证书就不说了,自己签发证书呢,见我的其他文章。
我发现,自己签名的证书弄好之后,从客户端打开服务端地址时,不再提示上面的错误,但是还是不能发送数据。原因是什么呢?因为那台证书在客户端操作系统上可信,但是在JAVA的KEYSTORE里不可信,要把服务端的证书导入KEYSTORE库中
导入办法:
打开命令行窗口,并到<java-home>\lib\security\ 目录下,运行下面的命令:
keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer
最后一个是服务端导出的证书,其他可以默认。
要注意的是,如果客户端电脑上装有许多个JAVA版本,要确定你导入的证书的JAVA版本是你TOMCAT使用的那个,一般TOMCAT使用的是环境变量指向的那个JAVA版本。
如果是在ECLIPSE中建立的TOMCAT服务器,新建时会要你选择默认JRE还是指向的JAVA,这里一定要选指向刚才导入的那个JAVA的路径,不然,你导入的证书库也没效果。
第二种办法,使用HTTPCLIENT时不检测服务器证书是否可信
扩展HttpClient 类实现自动接受证书
因为这种方法自动接收所有证书,因此存在一定的安全问题,所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下:
•提供一个自定义的socket factory (test.MySecureProtocolSocketFactory )。这个自定义的类必须实现接口org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory ,在实现接口的类中调用自定义的X509TrustManager(test.MyX509TrustManager) ,这两个类可以在随本文带的附件中得到
•创建一个org.apache.commons.httpclient.protocol.Protocol 的实例,指定协议名称和默认的端口号
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
•注册刚才创建的https 协议对象
Protocol.registerProtocol("https ", myhttps);
•然后按照普通编程 方式打开https 的目标地址,代码如下:
MySecureProtocolSocketFactory.java
import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.commons.httpclient.ConnectTimeoutException; import org.apache.commons.httpclient.params.HttpConnectionParams; import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory { private SSLContext sslcontext = null; private SSLContext createSSLContext() { SSLContext sslcontext=null; try { sslcontext = SSLContext.getInstance("SSL"); sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } return sslcontext; } private SSLContext getSSLContext() { if (this.sslcontext == null) { this.sslcontext = createSSLContext(); } return this.sslcontext; } public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket( socket, host, port, autoClose ); } public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket( host, port ); } public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort); } public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException { if (params == null) { throw new IllegalArgumentException("Parameters may not be null"); } int timeout = params.getConnectionTimeout(); SocketFactory socketfactory = getSSLContext().getSocketFactory(); if (timeout == 0) { return socketfactory.createSocket(host, port, localAddress, localPort); } else { Socket socket = socketfactory.createSocket(); SocketAddress localaddr = new InetSocketAddress(localAddress, localPort); SocketAddress remoteaddr = new InetSocketAddress(host, port); socket.bind(localaddr); socket.connect(remoteaddr, timeout); return socket; } } //自定义私有类 private static class TrustAnyTrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }
评论
发表评论
-
JAVA内存分析
2017-09-30 18:42 511jmap -heap pid : 查看堆的使用状况信息 ... -
java dump线程日志
2016-02-15 10:52 1557JVM 自带的工具获取线程堆栈: JDK自带命令行工具获取 ... -
spring 拦截器
2015-05-05 16:07 8771.拦截器配置 <mvc:intercepto ... -
用 ThreadLocal 管理用户session
2014-11-10 15:47 9253很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把 ... -
JAVA并发控制的几种办法
2014-08-25 16:43 2782假如有十张票,现在 ... -
synchronized
2014-08-21 16:58 1298synchronized 关键字的作 ... -
非阻塞同步机制与CAS操作
2014-07-29 16:07 1435锁的劣势 Java ... -
线程简介(转)
2014-04-21 12:06 807一、线程概述 线程是 ... -
什么是线程,如何创建线程
2014-04-21 12:03 972如果你学习过操作系统 ... -
线程池有助于实现最佳资源利用率
2014-04-21 10:01 1477为什么要用线程池? 诸如 Web 服务器、数据库服务器、 ... -
spring实现初始化和销毁bean之前进行的操作
2014-03-03 19:01 1016第一种:通过@PostConstruct 和 @PreDes ... -
文章自动添加超链接
2014-01-14 16:01 2209在网上可以发现,很多文章中的关键词会有超链接,超链接的实现 ... -
JVM 内存监控
2013-11-28 14:17 1084jps Java进程查看工具,实际上它和Unix/Lin ... -
freemarker操作字符串,数字,布尔类型函数
2013-11-26 16:45 6691布尔类型 1. 后台不能将值设置为Boolean对 ... -
汉字转拼音
2013-11-26 16:39 1242import net.sourceforge.pinyin4 ... -
birt读取现有系统的数据库配置作为数据源
2013-09-10 13:51 3865Birt的数据源可以用多种形式,当我们把BIRT嵌入到现有 ... -
birt动态SQL
2013-07-26 18:05 9119birt动态SQL实现有三种方式:拼接SQL、绑定变量和让 ... -
关于spring事务
2013-06-13 14:44 1021在ORACLE数据库中,一般DDL语句是隐式COMMIT提交 ... -
Tomcat Server是如何处理http请求的
2013-05-08 10:24 1337假设来自客户的请求为:http://localhost:8 ... -
注解annotation
2013-05-07 14:40 1128ava注解是附加在代码中的一些元信息,用于一些工具在编译、运 ...
相关推荐
此外,还需要创建一个SSLConnectionSocketFactory,它是HttpClient中的关键组件,负责建立安全的SSL/TLS连接。 接下来,`HttpClientUtil.java`文件可能是实现HttpClient工具类,提供一个静态方法来创建和初始化...
7. **HttpClient库**: Java内置的`HttpURLConnection`可以发送HTTPS请求,但更高级的库如Apache HttpClient提供了更多功能,如连接池、重试策略等,对于复杂的应用场景更加适用。 8. **HTTPS连接的建立**: 包括握手...
它使用SSL/TLS加密技术,在客户端和服务器之间建立加密连接。 2. **POST请求**:一种HTTP请求方法,用于向指定资源提交数据,通常用于创建新资源或更新现有资源。 #### 三、发送HTTPS POST请求的关键步骤 1. **...
同时,它也可以处理HTTPS连接,配置SSL上下文以实现安全通信。 7. **异步编程**:HttpClient 4.5及以上版本引入了AsyncHttpClient,支持异步非阻塞I/O,适用于高并发场景。 8. **Cookie管理**:HttpClient有一个...
HttpClient 3.1支持连接池,可以复用已建立的连接,提高性能。使用HttpConnectionManager来管理连接池,如SingleClientConnManager或MultiThreadedHttpConnectionManager。 五、重定向处理 HttpClient可以自动处理...
- **主机名验证**:演示了如何进行SSL连接的主机名验证。 #### 2.8 HttpClient代理配置 介绍了如何通过代理服务器发送HTTP请求。 ### 3. HTTP状态管理 #### 3.1 HTTP cookies 介绍了如何处理HTTP cookie。 #### ...
- **API调用**:对于RESTful API,HttpClient 是一个理想的客户端工具,可以方便地发送JSON或XML数据。 - **文件上传下载**:通过POST或PUT请求,HttpClient 可以实现文件的上传,通过GET请求实现文件的下载。 - ...
它支持 Keep-Alive 连接,能够重用已经建立的 TCP 连接,减少了网络延迟。 2. **认证与安全**:此版本加强了身份验证和安全特性,支持多种认证机制(如 Basic、Digest、NTLM 和 Kerberos),并提供了 TLS/SSL 支持...
6. **错误处理**:当请求失败时,可以通过捕获`IOException`和`HttpException`来处理异常,例如重试策略、错误信息的记录和反馈。 7. **HTTPS安全通信**:HttpClient支持HTTPS,通过设置`SSLContext`和`...
1. **执行流程**:从 `HttpClient.execute()` 方法开始,通过 `HttpRequestExecutor.execute()` 将请求发送到服务器,并接收响应。 2. **连接管理**:`PoolingHttpClientConnectionManager` 负责连接的创建、复用和...
在使用SSL时,可能会遇到`SSLPeerUnverifiedException`异常,这是因为服务器证书未被验证。为了解决这个问题,可以配置信任所有证书的策略: ```java SSLContext sslContext = SSLContexts.custom() ....
在发送HTTP请求时,开发者可能会循环遍历这些代码,为每个代码构建特定的URL(通常包括股票代码和某种查询参数),然后使用HTTPClient发送请求。 在处理股票数据时,开发者可能会用到Java的CSV解析库,如OpenCSV或...
1. **连接管理**:HTTPClient 4.5.6引入了连接池,能够高效地复用TCP连接,减少了建立新连接的开销。`httpcomponents-client-4.5.6.jar`包含了`HttpClient`类和相关的连接管理类,如`...
- **HttpClient配置**:HttpClientBuilder允许自定义连接管理器、重试策略、SSL上下文等高级设置。 2. **连接管理**: - **PoolingHttpClientConnectionManager**:管理HTTP连接的池,提高性能和资源利用率。 - ...
为了建立安全的连接,HttpClient支持使用SSL/TLS协议。 **2.7.2 与连接管理器集成** 套接字工厂可以与连接管理器集成,以便统一管理和配置所有连接。 **2.7.3 SSL/TLS定制** 可以根据需要对SSL/TLS协议进行定制,...
- **安全套接层:** 在HTTPS连接中,使用SSL/TLS协议来加密传输数据。 - **与连接管理器的集成:** 连接套接字工厂与连接管理器协同工作,共同完成安全连接的建立。 - **SSL/TLS定制:** 可以根据具体需求配置SSL/...
### httpclient 4.5 API文档知识点概览 #### 一、基础知识 ##### 1.1 请求执行 **1.1.1 HTTP请求** - **定义**:HTTP客户端通过发送HTTP请求来与服务器进行交互。 - **组成**: - 方法(GET、POST等); - URI...
3. 安全性:在处理敏感数据时,确保使用HTTPS协议,并正确配置SSL/TLS。 4. 性能优化:根据实际需求调整HttpClient的配置参数,如连接超时时间、最大连接数等。 总的来说,HTTPClient和HTTPCore是Java进行HTTP通信...
- 使用`SSLContext`和`SSLSocketFactory`配置HTTPS连接。 - 配置信任管理器和证书,处理自签名证书或特定CA。 8. **性能优化**: - 使用连接池减少连接建立时间,提高效率。 - 使用线程池管理异步请求,避免...