`
fox_mt
  • 浏览: 24025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

httpClient 处理https请求

阅读更多

今天遇到了个问题,相信很多人都遇到过,使用Httpclient请求https的链接是抛出类似的如下异常

javax.net.ssl.SSLException: hostname in certificate didn't match:www.XXX.com != www.xxx.com

首先来说这个问题产生的原因,根据百度的资料,和实际的情况,我的分析结果是

所请求的网站域名和服务器上的证书中的域名不符,导致请求方域名不匹配的异常

 

解决这个问题,还要看实际情况,请求的目的是什么,如果是要保证证书的正确,那就不用往下看了,因为下面说的是不需要保证证书正确的情况,想要保证证书正确,只能求助其他的大神,需要导入证书之类的,貌似很高端

 

我还是直接说下不需要保证证书正确,只要保证正常请求就可以的情况;

首先来说,需要有如下几个关键点

1,SSLContext sslContext

2,X509TrustManager tm

3,SSLConnectionSocketFactory sslsf

这三个我也没有深入研究,第一个我猜是构建那种协议,是SSL还是TLS之类的,第二个完全没想法

第三个就是httpClient链接的时候使用的socekt的工厂了。需要使用到前两个变量作为参数。

 

来看每个变量的初始化

sslContext= SSLContext.getInstance("SSL");//sslContext= SSLContext.getInstance("TLS");

这里是SSL还是TLS,要看自己的应用情况,我的情况,两种都合适,没所谓,我印象中TLS类似于继承自SSL,不知道区别是哪里,知道的朋友还请赐教

 

在看tm

X509TrustManager tm = new X509TrustManager() {

                public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {

                }

                public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };

 这个就是new了一个,没做什么操作

接下来需要对sslContext初始化

sslContext.init(null, new TrustManager[] { tm }, null);

这里就是tm的用武之地了,用于初始化sslContext

接下来就是SSLConnectionSocketFactory sslsf

的初始化

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

这里很关键的是第二个参数,个人理解,信任任何证书,说白了也就是不管证书,怎么样都信任,去访问

 

然后两种方式使我们设置的生效

一种是

Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory> create()

 

                    .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", sslsf).build();

使用registry,注意别把build丢了,这个很关键

 

另一种方式是直接在构建httpClient的时候设置

HttpClients.custom().setSSLSocketFactory(sslsf).build();

这里的HttpClients.custom()拿到的就是HttpClientBuilder

如果你有这个中间变量,可以直接使用

 

这样就可以解决问题

 

顺便说一句,我也尝试过使用类似

httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme(null, null, null));

注意Scheme这里参数需要填的,并非为空,此处仅是举例

这种方式并未成功,而且这种方式使过期的方式

未成功的原因可能是我使用的是CloseableHttpClient,如果使用defaultHttpClient就可以成功,具体原因还有待研究

 

各位共勉!

 

 

 

 

分享到:
评论

相关推荐

    HttpClient发起HTTPs请求.rar

    在这个"HttpClient发起HTTPs请求.rar"压缩包中,我们主要关注的是如何利用HttpClient处理HTTPS协议的GET和POST请求,以及如何处理返回的JSON数据。这里,我们将详细讨论相关知识点。 首先,HTTPS是一种基于SSL/TLS...

    httpClient发送HTTP请求

    本文将深入探讨如何使用HttpClient处理HTTPS请求,解决证书错误,并介绍XML内容格式的使用以及SHA1加密的相关知识。 首先,HTTPS协议是在HTTP基础上增加了SSL/TLS(安全套接层/传输层安全)协议,用于加密通信和...

    JAVA利用HttpClient进行HTTPS接口调用

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

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

    描述中提到的链接指向了一个ITEYE博客文章,虽然内容没有给出,但通常这类文章会包含如何配置和使用HttpClient来发送HTTPS请求的具体步骤。在实际操作中,我们可能需要关注以下几点: 1. **导入依赖**:文件列表中...

    esp8266 发起https 请求

    - ESP8266的内存有限,处理复杂的HTTPS请求时需要考虑内存管理,避免请求过大导致内存溢出。 - 考虑到安全性和稳定性,定期更新ESP8266的固件和库,修复可能的安全漏洞。 总结来说,ESP8266发起HTTPS请求涉及到...

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

    在IT行业中,HttpClient是一个常用的Java库,用于执行HTTP和HTTPS请求。这个实例主要涉及如何配置HttpClient来忽略SSL(Secure Socket Layer)验证,这对于在开发和测试环境中处理自签名证书或未认证的服务器非常...

    给予javaWeb-httpclient请求https实例demo

    在Java Web开发中,HTTPClient库是一个非常强大的工具,它允许开发者执行HTTP和HTTPS请求,进行数据交互。本文将深入探讨如何使用HTTPClient库来发送HTTPS请求,以及涉及到的证书管理相关知识。 首先,理解HTTPS...

    java使用HttpClient发送http请求

    在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    综上所述,HttpClientUtil工具类在IT应用中扮演着关键角色,简化了HTTP和HTTPS请求的实现,特别是发送文件这样的复杂操作。通过封装HttpClient的核心功能,开发者可以更加专注于业务逻辑,而不必关心底层网络通信的...

    应用HttpClient时添加的代码。

    hostnameincertificatedidn'tmatchϢhttpclienthostnameincertificatedidn'tmatchҪӵĴ룺`”,这段话翻译过来大致意思是:“在使用HttpClient处理HTTPS请求时遇到的`SSLException`异常:证书中的主机名不匹配。...

    HttpClient Https实战

    HttpClient是Apache基金会开发的一个Java库,用于执行HTTP和HTTPS请求。在实际的IT工作中,HttpClient是一个非常重要的工具,尤其在需要进行HTTP通信或者自动化测试时。这篇博客“HttpClient Https实战”很可能详细...

    JAVA利用HttpClient进行POST请求(HTTPS)实例

    本实例将介绍如何使用HttpClient进行POST请求,特别是针对HTTPS的请求,以避免证书校验过程。 首先,我们需要创建一个自定义的SSLClient类,这个类继承自DefaultHttpClient。在SSLClient类中,我们将重写SSL证书的...

    httpclient来进行https访问

    在处理HTTPS请求时可能会遇到各种异常情况,比如证书验证失败等。为此,可以定义一个自定义异常类,例如`AuthSSLInitializationError`,用于捕获此类错误: ```java public class AuthSSLInitializationError ...

    httpclient发送post请求.docx

    HttpClient是Apache基金会开发的一个强大的Java HTTP客户端库,它允许开发者轻松地执行HTTP和HTTPS请求,提供了丰富的功能,包括自定义请求头、管理Cookie、处理HTTP代理等。在本文中,我们将深入探讨如何使用...

    Https请求工具类,Java实现http请求,https请求

    首先,需要引入相关的Java包,包括java.io、java.net、javax.net.ssl等,并且需要使用Apache Commons HttpClient来处理Http和Https请求。 下面是HttpsUtil类的实现代码: ```java public class HttpsUtil { ...

    httpclient 绕开HTTPS证书校验

    在IT行业中,网络通信安全是至关重要的,尤其是在处理HTTPS(HTTP over SSL/TLS)协议时。HTTPS通过使用SSL/TLS协议来加密传输数据,保护用户的隐私和数据安全。然而,在某些特殊情况下,如进行测试、调试或者处理自...

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

    HttpClient支持HTTP/1.1和HTTP/2.0协议,并提供了丰富的功能来处理HTTP请求和响应。 知识点2:HTTPS接口调用的必要性 随着网络安全的日益重要,HTTPS协议作为一种加密的网络协议,已经成为网络安全的标准之一。...

    httpclient ssl 相关问题解决资料

    在使用Apache HttpClient处理HTTPS请求时,可能会遇到与SSL相关的安全问题。当与未验证或自签名的证书的服务器通信时,HttpClient会抛出`javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated`异常。...

    HttpClient模拟http浏览器请求

    9. **HTTPS支持**:HttpClient可以处理HTTPS请求,只需要确保使用的SSLContext和TrustManager正确配置。 10. **版本兼容性**:HttpClient有多个版本,不同版本间API可能会有所变化。例如,从4.x到5.x,很多类和方法...

    详解.NET Core 使用HttpClient SSL请求出错的解决办法

    首先,了解HttpClient处理HTTPS请求的机制非常关键。HttpClient默认使用ServicePointManager和SslStream来确保SSL/TLS的安全通信。在建立连接之前,HttpClient会检查目标服务器的SSL证书的有效性。如果证书不是由受...

Global site tag (gtag.js) - Google Analytics