HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常

2023-11-10

在开发https应用时,你的测试服务器常常没有一个(有效的)SSL证书。在你的客户端连接测试服务器时,如下的异常会被抛出:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。

我将讨论使用Apache HttpClient时,解决该问题的一种方法(http://hc.apache.org/httpcomponents-client/)。

 

1. 代码片段

通常,你会像下面那样来创建HttpClient:

我们将需要告诉client使用一个不同的TrustManager。TrustManager(http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/javax/net/ssl/TrustManager.html)是一个检查给定的证书是否有效的类。SSL使用的模式是X.509(http://en.wikipedia.org/wiki/X.509),对于该模式Java有一个特定的TrustManager,称为X509TrustManager。首先我们需要创建这样的TrustManager。

下面我们需要找到一个将TrustManager设置到我们的HttpClient的方法。TrustManager只是被SSL的Socket所使用。Socket通过SocketFactory创建。对于SSL Socket,有一个SSLSocketFactory(http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/javax/net/ssl/SSLSocketFactory.html)。当创建新的SSLSocketFactory时,你需要传入SSLContext到它的构造方法中。在SSLContext中,我们将包含我们新创建的TrustManager。

首先我们需要得到一个SSLContext:

TLS是SSL的继承者,但是它们使用相同的SSLContext。

然后我们需要使用我们上面新创建的TrustManager来初始化该上下文:

最后我们创建SSLSocketFactory:

现在我们仍然需要将SSLSocketFactory注册到我们的HttpClient上。这是在SchemeRegistry中完成的:

我们注册了一个新的Scheme,使用协议https,我们新创建的SSLSocketFactory包含了我们的TrustManager,然后我们告诉HttpClienthttps的默认端口是443.


2. 完整示例代码

下面的类接收HttpClient作为参数,然后返回一个新的接受任意SSL证书的HttpClient:

package com.vixuan.vplex;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;






public class PostDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//请求格式https://mgmt-server-ip/vplex/clusters/cluster-name
		String url="https://172.16.1.5/vplex/clusters/cluster-1";
		
		List<NameValuePair> params=new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("Username","Service"));
		params.add(new BasicNameValuePair("Password","Mi@Dim77"));
		params.add(new BasicNameValuePair("args","cluster status"));
		
		String result=sendPost(url,params);
		System.out.println(result);
		
		
	}
	
	
	
	public static String sendPost(String url,List<NameValuePair> params){
		String result="";
		
		 HttpClient client1 = new DefaultHttpClient();
		 HttpClient client =WebClientDevWrapper.wrapClient(client1);
         HttpPost httppost = new HttpPost(url); 
         
         try {  
             // Post请求  
             // 设置参数  
             httppost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));  
             // 发送请求  
             HttpResponse httpresponse = client.execute(httppost);  
             HttpEntity entity = httpresponse.getEntity();  
             result = EntityUtils.toString(entity);  
             System.out.println(result);  
         } catch (UnsupportedEncodingException e) {  
             // TODO Auto-generated catch block  
             e.printStackTrace();  
         } catch (ClientProtocolException e) {  
             // TODO Auto-generated catch block  
             e.printStackTrace();  
         } catch (ParseException e) {  
             // TODO Auto-generated catch block  
             e.printStackTrace();  
         } catch (IOException e) {  
             // TODO Auto-generated catch block  
             e.printStackTrace();  
         }  
		 
		return result;
	}
	<span style="color:#ff0000;"> public static class WebClientDevWrapper {
	
	public static HttpClient wrapClient(HttpClient base) 
	{
	    try {
	        SSLContext ctx = SSLContext.getInstance("TLS");
	        X509TrustManager tm = new X509TrustManager() {

	            public void checkClientTrusted(X509Certificate[] chain,
	                    String authType) throws CertificateException
	            {
	                // TODO Auto-generated method stub

	            }

	            public void checkServerTrusted(X509Certificate[] chain,
	                    String authType) throws CertificateException
	            {
	                // TODO Auto-generated method stub

	            }

	            public X509Certificate[] getAcceptedIssuers()
	            {
	                // TODO Auto-generated method stub
	                return null;
	            }

	        };
	        ctx.init(null, new TrustManager[] { tm }, null);
	        SSLSocketFactory ssf = new SSLSocketFactory(ctx);
	        ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	        ClientConnectionManager ccm = base.getConnectionManager();
	        SchemeRegistry sr = ccm.getSchemeRegistry();
	        //设置要使用的端口,默认是443
	        sr.register(new Scheme("https", ssf, 443));
	        return new DefaultHttpClient(ccm, base.getParams());
	    } catch (Exception ex) {
	        ex.printStackTrace();
	        return null;
	    }
	}</span>
	
}
	
	
	
	
	
	
	

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常 的相关文章

  • sqlalchemy Connection Pool

    sqlalchemy 默認的pool size 5 pool裡存放的是在跟數據庫的的閒置連接 使用c1 engine connect 或 session scoped session sessionmaker bind engine 會創建
  • AI数字人:语音驱动面部模型及超分辨率重建Wav2Lip-HD

    1 Wav2Lip HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型 它们被用于实现数字人的语音和图像方面的功能 通过Wav2Lip HD项目可以快速使用这两种模型 完成高清数字人形象的打造 项目代码地址 github地址
  • 判断服务器芯片还是民用芯片,抢鲜看,Xeon E3-1230对比I7 2600评测

    印在包装上的规格 附带的原装风扇与桌面级完全相同 CPU正反面对比图 除了型号之外完全相同 在研究完CPU之后还有必要研究一下所支持的主板芯片组 Intel方面给予Xeon E3 1000系列所提供的芯片组分为C202 C204以及C206
  • 使用 RedisTemplate 对象的 opsForValue() 方法获取 Redis 中的值获取不到

    问题 使用 RedisTemplate 对象的 opsForValue 方法获取 Redis 中的值获取不到 详细问题 笔者代码如下 1 使用 ValueOperations 对象的 set 方法将一个键值对存储到 Redis 中 valu
  • 75-局部自定义指令——bind和update方法

    75 局部自定义指令 bind和update方法 这里通过directives指令实现
  • OPENWRT或旁路由如果不能正常使用opkg,正确上网等的一种解决方法

    家里有个n1 我刷了个openwrt做旁路由 主路由是 AC2100 莫名其妙的无法正常使用某些功能 例如opkg updae 正确上网也不行 按照之前的教训 防火墙的设置影响较大 我用的防火墙规则是自带的lan规则 如下图所示 并不满足作
  • win11安装tensorRt成功

    1 安装cuda 查看电脑cuda版本 nvidia smi 我的是11 6 下载链接 https developer nvidia com cuda 11 6 0 download archive target os Windows ta
  • 《域渗透攻防指南》签名版预售来啦

    千呼万唤始出来 终于 在广大粉丝翘首期盼下 国内首本专门讲述域内攻防的书籍 域渗透攻防指南 在2022年最后一个月和大家见面了 为了回馈粉丝的等待 让粉丝早日拿到心仪的书 特此联合机械工业出版社弄了签名版书预售活动 数量有限 仅限前500名
  • Typescript - 枚举类型 enum,详细介绍与使用教程(快速入门)

    介绍 在任何项目开发中 我们都会遇到定义常量的情况 常量就是指不会被改变的值 TS 中我们使用 const 来声明常量 但是有些取值是在一定范围内的一系列常量 比如一周有七天 比如方向分为上下左右四个方向 这时就可以使用枚举 Enum 来定
  • JavaScript-三种弹窗方式

    JavaScript 三种弹窗方式 一 alert 带内容的弹框 用法 二 confirm 带选择的弹框 用法 专门建立的学习Q q u n 731771211 分享学习方法和需要注意的小细节 不停更新最新的教程和学习技巧 从零基础开始
  • 如何在mac上运行vue项目

    本人使用的是Mac笔记本 所以搭建Vue环境的时候遇到了一些坑 在此做下记录希望可以帮到和我一样掉坑的人 都说Vue和小程序有些地方很相似 便从朋友手里要了一个Vue的项目想着尝试看看 结果项目到手才发现坑了不是一个编辑器运行就可以解决的
  • LeetCode 236. 二叉树的最近公共祖先——Python实现(递归,哈希表)

    1 直接用递归的方法 使用递归的方法 找出二叉树中两个节点的最近公共祖先 分析如下 对于两个节点p和q的公共祖先r 他们要么在r的同一边 要么在这个节点的两边 因此 只要满足这两个条件即可 也就是说 只要 f r child p and f

随机推荐

  • 【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 文献来源 4 Matlab代码 数据 文章讲解 1 概述 文献来
  • slam数据集整合

    根据大家的要求 在此整合一下常用的几个数据集 我平时话太啰嗦了 这里就简单一些 为啥编辑器的分隔线都这么萌 1 Tum数据集 这个大家用的人都知道 RGB D数据集 有很多个sequence 自带Ground truth轨迹与测量误差的脚本
  • 【ElasticSearch】ElasticSearch 中使用衰减函数来完美你的搜索结果

    1 概述 转载 ElasticSearch 中使用衰减函数来完美你的搜索结果 最近的项目在原有的搜索需求增加功能 ElasticSearch 7 6 请注意 大版本不同可能参数不同 原有搜索 简单的标题 正文 全文索引 新加功能 在原有的基
  • 第十三章 网络命名空间(内核源码实现)--基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 有两篇翻译博文 Lxc之二 网络设置 和 linuxnamespace 之使用 LXC文章中关于网络的设置是从用户空间配置的 从该文章可
  • 安装JDK7和Tomcat8.5后,Tomcat服务启动不了

    windows64位系统安装JDK7 0与Tomcat8 5 35需要注意的 一 JDK7 0和Tomcat8 5 35都要是64的版本 否则Tomcat服务会启动不了 JDK7 0如果不是64位 安装的时候会自动安装在C Program
  • Qt中正则表达式

    TOC 不积跬步 无以至千里 Qt中正则表达式 正则表达式 regular expression 就是在一个文本中匹配子字符串的一种模式 pattern 它可以简写为 regexp 一个regexp主要应用在以下几个方面 验证 一个rege
  • 数据结构c语言版如何运行程序,数据结构c语言怎么运行啊

    首先要确定你想采用线性表的顺序存储结构还是链式存储结构 以顺序存储结构为例 include include define ERROR 0 define OK 1 typedef int Status typedef int ElemType
  • pom 通用配置

  • Vue自定义指令directive(详细)

    个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 1 什么是自定义指令 v 开头的行内属性 都是指令 不同的指令可以完成或实现不同的功能 除了内置指令外 Vue 也允许注册自定义指令 有的情况下 你仍然
  • 服务器上安装mpi4py

    服务器上安装mpi4py 尝试方法1 失败 python m pip install mpi4py 结果报错 缺失某一个库文件导致编译失败 解决方法 如果有权限的话可以sudo安装libopenmpi dev解决 否则只能手动编译 尝试方法
  • Python - 注释

    单行注释 comments 多行注释 comments comments 模块文档 1 用法 模块名 doc 2 显示代码块的简要说明 3 任何代码块 文件 类 函数 均可以有文档说明 不跨行 comments 跨行 comments co
  • OkHttp:自定义缓存

    设置OkHttp 的缓存策略 没网络直接读取缓存 并且设置缓存生命周期为 30s 自定义 Interceptor 请求策略 没有网络直接读取缓存 public class CacheRequestInterceptor implements
  • 目标检测算法——mmdetection下面的deformable-detr运行

    1 环境 包 版本 mmcv full 1 4 2 mmdet 2 19 1 torch 1 10 0 cu113 torchvision 0 11 1 cu113 2 文档 mmet官方文档 mmcv官方文档 源码下载 3 数据集 自定义
  • javascript的比较运算符

    比较运算符的隐士转换 这里只比较 字符串和 数字 对象的比较没有意义 一般返回的是false 234 lt 78 true 234 lt 78 false 234 lt 78 false 总结 只有当 comparison operator
  • Qt中的ui指针和this指针

    本博客中关于C 和QT 无特别说明开发环境为 Visual studio 2013 QT为5 9 9 特此说明 谨慎参考 希望能帮助到爱好者 首先看ui指针的定义 在mainwindow h中 private Ui MainWindow u
  • VisualStudio 无法登录

    文章转载自 https cloud tencent com developer article 1342617 如果遇到 visualStudio 无法登陆 可以看下我的方法 可能有用 尝试关闭代理 打开设置 网络 代理 关了它 试试 如果
  • zookeeper基本概念及使用场景

    zookeeper基本概念及使用场景 Zookeeper作为一种协调分布式应用高性能的调度服务 在ZooKeeper中 节点类型可以分为 持久节点 PERSISTENT 临时节点 EPHEMERAL 时序节点 SEQUENTIAL 具体在节
  • 机器学习项目的实验方法

    发现对于一些机器学习项目 在项目进行中往往会直接就开始编码实现 而没有一套完整的方法论和有实操性的流程 经过一些粗浅的研究 下面写出一些对于此的部分思考 或有参考借鉴之用 实验开始前 需要清楚研究什么 如何收集数据 打算怎样分析 1 研究目
  • Crunchfish发布XR Skeleton手势交互解决方案

    转自 https baijiahao baidu com s id 1677811512042412943 wfr spider for pc 移动交互解决方案开发商Crunchfish日前发布了名为XR Skeleton的手势控制技术 只
  • HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常

    在开发https应用时 你的测试服务器常常没有一个 有效的 SSL证书 在你的客户端连接测试服务器时 如下的异常会被抛出 javax net ssl SSLPeerUnverifiedException peer not authentic