今天遇到了个问题,相信很多人都遇到过,使用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协议的GET和POST请求,以及如何处理返回的JSON数据。这里,我们将详细讨论相关知识点。 首先,HTTPS是一种基于SSL/TLS...
本文将深入探讨如何使用HttpClient处理HTTPS请求,解决证书错误,并介绍XML内容格式的使用以及SHA1加密的相关知识。 首先,HTTPS协议是在HTTP基础上增加了SSL/TLS(安全套接层/传输层安全)协议,用于加密通信和...
总的来说,使用Java的HttpClient进行HTTPS接口调用涉及到配置SSL上下文、初始化HttpClient、创建请求对象以及处理响应。了解这些知识点对于开发安全的、能够与HTTPS服务进行通信的Java应用程序至关重要。通过实践和...
描述中提到的链接指向了一个ITEYE博客文章,虽然内容没有给出,但通常这类文章会包含如何配置和使用HttpClient来发送HTTPS请求的具体步骤。在实际操作中,我们可能需要关注以下几点: 1. **导入依赖**:文件列表中...
- ESP8266的内存有限,处理复杂的HTTPS请求时需要考虑内存管理,避免请求过大导致内存溢出。 - 考虑到安全性和稳定性,定期更新ESP8266的固件和库,修复可能的安全漏洞。 总结来说,ESP8266发起HTTPS请求涉及到...
在IT行业中,HttpClient是一个常用的Java库,用于执行HTTP和HTTPS请求。这个实例主要涉及如何配置HttpClient来忽略SSL(Secure Socket Layer)验证,这对于在开发和测试环境中处理自签名证书或未认证的服务器非常...
在Java Web开发中,HTTPClient库是一个非常强大的工具,它允许开发者执行HTTP和HTTPS请求,进行数据交互。本文将深入探讨如何使用HTTPClient库来发送HTTPS请求,以及涉及到的证书管理相关知识。 首先,理解HTTPS...
在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...
综上所述,HttpClientUtil工具类在IT应用中扮演着关键角色,简化了HTTP和HTTPS请求的实现,特别是发送文件这样的复杂操作。通过封装HttpClient的核心功能,开发者可以更加专注于业务逻辑,而不必关心底层网络通信的...
hostnameincertificatedidn'tmatchϢhttpclienthostnameincertificatedidn'tmatchҪӵĴ룺`”,这段话翻译过来大致意思是:“在使用HttpClient处理HTTPS请求时遇到的`SSLException`异常:证书中的主机名不匹配。...
HttpClient是Apache基金会开发的一个Java库,用于执行HTTP和HTTPS请求。在实际的IT工作中,HttpClient是一个非常重要的工具,尤其在需要进行HTTP通信或者自动化测试时。这篇博客“HttpClient Https实战”很可能详细...
本实例将介绍如何使用HttpClient进行POST请求,特别是针对HTTPS的请求,以避免证书校验过程。 首先,我们需要创建一个自定义的SSLClient类,这个类继承自DefaultHttpClient。在SSLClient类中,我们将重写SSL证书的...
在处理HTTPS请求时可能会遇到各种异常情况,比如证书验证失败等。为此,可以定义一个自定义异常类,例如`AuthSSLInitializationError`,用于捕获此类错误: ```java public class AuthSSLInitializationError ...
HttpClient是Apache基金会开发的一个强大的Java HTTP客户端库,它允许开发者轻松地执行HTTP和HTTPS请求,提供了丰富的功能,包括自定义请求头、管理Cookie、处理HTTP代理等。在本文中,我们将深入探讨如何使用...
首先,需要引入相关的Java包,包括java.io、java.net、javax.net.ssl等,并且需要使用Apache Commons HttpClient来处理Http和Https请求。 下面是HttpsUtil类的实现代码: ```java public class HttpsUtil { ...
在IT行业中,网络通信安全是至关重要的,尤其是在处理HTTPS(HTTP over SSL/TLS)协议时。HTTPS通过使用SSL/TLS协议来加密传输数据,保护用户的隐私和数据安全。然而,在某些特殊情况下,如进行测试、调试或者处理自...
HttpClient支持HTTP/1.1和HTTP/2.0协议,并提供了丰富的功能来处理HTTP请求和响应。 知识点2:HTTPS接口调用的必要性 随着网络安全的日益重要,HTTPS协议作为一种加密的网络协议,已经成为网络安全的标准之一。...
在使用Apache HttpClient处理HTTPS请求时,可能会遇到与SSL相关的安全问题。当与未验证或自签名的证书的服务器通信时,HttpClient会抛出`javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated`异常。...
9. **HTTPS支持**:HttpClient可以处理HTTPS请求,只需要确保使用的SSLContext和TrustManager正确配置。 10. **版本兼容性**:HttpClient有多个版本,不同版本间API可能会有所变化。例如,从4.x到5.x,很多类和方法...
首先,了解HttpClient处理HTTPS请求的机制非常关键。HttpClient默认使用ServicePointManager和SslStream来确保SSL/TLS的安全通信。在建立连接之前,HttpClient会检查目标服务器的SSL证书的有效性。如果证书不是由受...