httpclient信任所有证书解决SSLException:Unrecognized SSL message,plaintext connection

在使用 HttpClient 工具调用第三方 Http 接口时报错 javax.net.ssl.SSLException:Unrecognized SSL message,plaintext connection?

这个错误意思是说,无法识别 SSL 信息,明文连接?

看这个意思是说在使用 https 协议访问网络资源时无法识别 SSL 信息。

SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范!

起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HPPTS是HTTP+SSL/TCP的简称。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

本来 https 是在 http 的基础上进行加密。使用 SSL 协议进行加密。

这样通讯的双方在通讯前就要去做身份校验,通过证书的方式验证身份。

原来是证书方面的问题,需要我们加一下代码,使其信任所有证书。

如下代码,设置信任所有代理。

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class HttpClientUtil{

    public static CloseableHttpClient createSSLClientDefault() {
        try {
            //使用 loadTrustMaterial() 方法实现一个信任策略,信任所有证书
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            //NoopHostnameVerifier类:  作为主机名验证工具,实质上关闭了主机名验证,它接受任何
            //有效的SSL会话并匹配到目标主机。
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();

    }
}

获取HttpClient 实例的方式由使用默认的 httpclient 变为我们自定义的 httpclient 实例

即,由

变为

这解决了我的问题。

原文地址:https://www.cnblogs.com/ibigboy/p/11265855.html

时间: 2024-08-03 23:00:12

httpclient信任所有证书解决SSLException:Unrecognized SSL message,plaintext connection的相关文章

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证 1.SSL单向验证时 代码如下: Java代码   import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.a

《谷歌宣布Chrome不再信任所有赛门铁克SSL证书》误读新闻的澄清说明

7月31日下午,各大媒体平台以及论坛发布的<Google宣布Chrome不再信任赛门铁克所有SSL证书>的新闻存在标题误读.夸大事实.不符合实际的情况. 关于新闻中的错误主要说明以下几点: 1.首先,赛门铁克的所有SSL证书都可以正常使用.之所以有这样的报道出现是因为:赛门铁克SSL证书签发的PKI系统要进行安全升级,谷歌为了督促赛门铁克此次更新,计划在2018年10月23号Chrome版本发布后,不信任赛门铁克未更新的PKI系统签发的证书,而非不信任赛门铁克所有的SSL证书,这是一个严重的误

java https client信任所有证书

package httpsclient; import java.io.IOException;import java.util.List;import java.util.ArrayList; import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.clien

便宜SSL证书怎么申请?SSL证书多少钱?

网站加了SSL证书就等于给网站做了加密处理,有效防止dns劫持域名,以及防止网站重要信息被窃取等很多实用的功能,即便100多元的证书也能实现这些,同时浏览器提示安全,网址变成https,浏览器地址栏会显示绿色小锁.ssl证书多少钱 ?这是很多人比较关心的一个问题.最便宜的SSL证书当然是免费SSL证书,但是免费的SSL证书不稳定,比较容易掉.SSL证书分根据品牌,域名数量,类型的不一样,价格也是不一样的,从几百到几万元都是不等的SSL证书的种类有哪些?DV型SSL证书:这种证书只是显示一个绿色小

SSL证书是什么?SSL证书怎么申请?

一.SSL证书是什么 SSL证书是数字证书的一种,由权威数字证书机构(CA)验证网站身份后颁发,可实现浏览器和网站服务器数据传输加密.网站安装SSL证书后会在浏览器显示安全锁标志,数据传输协议从http(传统协议) 升级为 https(加密协议). 二.SSL证书的作用 (1)浏览器绿色安全标志 各大主流浏览器的重视,对没有安装SSL证书的网站提示"不安全",安装了SSL证书的网站浏览器会显示绿色安全标志,表示连接安全. (2)网站数据加密传输 安装SSL证书之后,网站会从升级为 ht

Android HttpClient 用法以及乱码解决

一.Post提交 并可以实现多文件上传 // 创建DefaultHttpClient对象 HttpClient httpclient = new DefaultHttpClient(); // 创建一个HttpGet对象 HttpPost post = new HttpPost(realUrl); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); if (params != nu

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)[zz]

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)[zz]转载 <javascript:;> 2015-06-09 20:21:04 from:http://www.cnblogs.com/guogangj/p/4118605.html之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领 域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂.写这篇文

【mysql】service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误

service MySQL start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [[email protected] ~]# service mysql startmysql: unrecognized service[[email protected] ~]# service mysql restartmysql: unrecognized service [[email protected] ~]# rpm -q mysql   查

service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误

service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [[email protected] ~]# service mysql startmysql: unrecognized service[[email protected] ~]# service mysql restartmysql: unrecognized service [[email protected] ~]# rpm -q mysql 查询发