Java调用HTTPS接口,绕过SSL认证

news2025/2/28 6:33:05

1:说明

网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。

Java调用HTTPS,需要与客户端建立连接,但是建立连接的时候,需要进行SSL认证。有的时候为了方便调用,我们会绕过SSL认证。但是在特定环境中,绕过SSL认证是十分不安全的,不推荐这么做。SSL认证是确保通信安全的重要手段,绕过认证的话可能带来一系列的安全问题。

所以一般绕过SSL认证不在生产环境中使用。

2:绕过SSL认证

因为我本次调用HTTPS接口的目的是调用数据,存储在表中,不需要跨环境,只在本地执行,所以进行SSL认证稍有繁琐,所以我决定绕过SSL认证。

通过自定义SSL上下文的方式,绕过SSL认证的方式。通过自定义信任管理器,你可以在绕过证书验证的同时,实现自己的证书验证逻辑。这对于使用自签名证书或特定信任机制的情况很有用。

最后返回一个绕过SSL认证的 HttpClient对象。

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;


// 创建自定义的 SSL 上下文,用于绕过证书验证
	public static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				// 信任所有证书
				public boolean isTrusted(X509Certificate[] arg0, String arg1)
						throws CertificateException {
					return true;
				}
			}).build();
			// 创建主机名验证器,用于绕过主机名验证
			HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
			// 创建 SSL 连接套接字工厂,将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
			// 创建自定义的 CloseableHttpClient 实例,将 SSL 连接套接字工厂应用于 HTTP 客户端
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return HttpClients.createDefault();
	}

该方法的实现逻辑如下:

  1. 创建一个自定义的 SSL 上下文(SSLContext),用于绕过 SSL 证书验证。
  2. 在 SSL 上下文中加载信任材料(TrustMaterial),并使用自定义的 TrustStrategy 来信任所有证书。
  3. 创建一个主机名验证器(HostnameVerifier),用于绕过主机名验证。使用NoopHostnameVerifier(主机名验证器)意味着在SSL连接中不会对服务器的主机名进行验证。主机名验证器用于验证SSL证书中的主机名与服务器实际的主机名是否匹配。NoopHostnameVerifier是一个空实现的主机名验证器,它绕过了主机名验证,即使主机名不匹配,也会继续进行SSL连接。
  4. 创建一个 SSL 连接套接字工厂(SSLConnectionSocketFactory),将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接。创建自定义的SSL连接。有四种实现方式(指定SSL/TLS协议版本、指定加密算法和密码套件、自定义信任管理器、自定义主机名验证器),其中通过SSLConnectionSocketFactory指定自定义的主机名验证器(HostnameVerifier),以控制主机名验证的行为。
  5. 创建一个自定义的 CloseableHttpClient 实例,使用上述的 SSL 连接套接字工厂。
  6. 如果在创建 SSL 上下文时发生异常,将打印异常堆栈跟踪信息。
  7. 如果在创建 SSL 上下文时发生异常或抛出的异常类型无法识别,将返回默认的 CloseableHttpClient 实例。

3:调用HTTPS接口

private static final String SERVICE_URL = "https://ip:port/api/v1/cipher/json/create";
    private static final String AUTHORIZATION_HEADER = "savhsdkfas==";

    public ReturnT<String> execute(String param) throws Exception {

        //发送httpPost请求
        //创建HttpClient
        HttpClient httpclient = Myutils.createSSLClientDefault();
        //发送接口地址
        HttpPost httppost = new HttpPost(SERVICE_URL);
        //设置请求体格式Content-Type
        httppost.setHeader("Content-Type", "application/json");
        httppost.setHeader("Authorization", AUTHORIZATION_HEADER);

        //定义String请求Json参数体
        httppost.setEntity(new StringEntity(new String("{" +
                "\"keyCode\": \"" + keycode + "\"," +
                "\"algorithmParam\": \"SM4/ECB/PKCS7Padding\"," +
                "\"data\": {" +
                "\"SetlNewDTO\": \"" + this.convertDtoToBase64(accountPayDO) + "\"" +
                "}" +
                "}"), Charset.forName("UTF-8")));
        //发送请求并接收response
        HttpResponse httpresponse = httpclient.execute(httppost);
        String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode responseJson = objectMapper.readTree(result);
        // 从JSON对象中获取键值对,根据出参格式获取出参数据
        JsonNode jsonNode = responseJson.get("data");
        JsonNode encData1 = jsonNode.get("encData");
        String encDate2 = encData1.toString();

    }

这段代码是一个使用Apache HttpClient库发送HTTP POST请求的示例。它发送一个带有JSON参数的POST请求,并从响应中提取特定的数据。

代码中的execute方法声明了抛出Exception异常,它接收一个String类型的参数param,但实际上没有使用到该参数。

首先,代码定义了服务的URL和授权头信息。

然后,通过调用Myutils.createSSLClientDefault()方法创建一个自定义的SSL HttpClient对象。就是上边绕过SSL对应的方法

接下来,创建一个HttpPost对象,并设置请求的URL和请求头信息。

然后,构造请求体的JSON参数,并设置到HttpPost对象中。

构造请求体的使用需要使用json格式参数,也可以直接使用 GJson json = new GJson(jsonStr);将非JSON数据转化为JSON格式,JSON格式的S他脸红,需要给每个参数加上引号,并且使用\转译。所以setEntity的时候需要带有JSON格式的字符串。

String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";

GJson json = new GJson(jsonStr);

接着,通过调用HttpClient的execute方法发送HttpPost请求,并接收HttpResponse响应。

将响应的实体内容转换为字符串,并存储在result变量中。

使用Jackson库的ObjectMapper类解析result字符串为JsonNode对象。

从JsonNode对象中获取特定的数据,例如从"data"键中获取"encData"键的值。

最后,将获取到的"encData"值存储在encDate2变量中。

我的出参是这样的,所以按照自己的格式替换数据,便可以得到你想要的出参

{
	"code": "0",
	"message": "success",
	"data": {
		"encData": {
			"date": "wxpOGSdQD68Jp7fC4KV"
		}
	}
}

需要注意的是,代码中的URL、授权头信息、JSON参数等是示例数据,你需要根据实际情况进行修改和替换。

此代码片段只是一个简单的示例,实际使用时应该考虑异常处理、资源释放等更完善的逻辑。

 最高级的自律,从一点点到亿点点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

主播直播美颜SDK:性能优化策略

当下&#xff0c;主播直播美颜SDK成为了越来越多主播的利器。这些SDK可以实时美化主播的外貌&#xff0c;提高视觉吸引力&#xff0c;但同时也需要处理大量的图像数据。因此&#xff0c;性能优化成为了不可或缺的一环。本文将探讨主播直播美颜SDK的性能优化策略&#xff0c;以确…

【word技巧】word文档如何转换为ppt文件?

大家是否会遇到需要将word文档转换为ppt文件的情况&#xff1f;除了反反复复粘贴复制以外&#xff0c;还有其他方法可以转换文件格式&#xff0c;今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题&#xff0c;副标题设…

【C++初阶】——初始化列表static成员友元内部类匿名对象

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C头疼记 代码仓库&#xff1a;Gitee 目录 前言 再谈构造函数 初始化列表 explicit关键字 匿名对象 static成员 友元 友元函数 友元类 内部类 再次理解类和对象 前言 前几篇文章我们对于分别对C类…

未来的无人驾驶时代会对我们带来哪些影响?

未来的无人驾驶时代&#xff1a;无人驾驶技术发展现状、未来趋势以及迈入无人驾驶时代后会给我们带来哪些积极影响 过去&#xff0c;说起无人驾驶汽车&#xff0c;就像是科幻小说中的情节。但时至今日&#xff0c;这种情况已经改观&#xff1a;谷歌、特斯拉、福特等多家大型公…

docker打包container成image,然后将image上传到docker hub

第一步&#xff1a;停止正在运行的容器 docker stop <container_name> eg: docker stop xuanjie_mlir 第二步&#xff1a;将对应的container打包成image docker commit <container_id> <镜像名&#xff1a;版本> eg&#xff1a;docker commit 005672e6d97a…

开放式耳机能保护听力吗,开放式耳机跟骨传导耳机哪个更好?

如果从严格意义上来讲的话&#xff0c;开放式耳机中的骨传导耳机是能保护听力&#xff0c;现如今的开放式耳机是一个统称&#xff0c;将所有不入耳的类目全部规划到一块。因此在开放式耳机中存在着一些耳机是只能够保持周边环境音&#xff0c;而不是保护听力的。 下面让我来给…

基于单片机设计的电子柜锁

一、前言 随着现代社会的不断发展&#xff0c;电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处&#xff0c;例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因; 在事件中添加红色选框中的代码: WiFi连接失败错误码如下所示: REASON_UNSPECIFIED = 1,REASON_AUTH_EXPIRE = 2,REASON_AUTH_LEAVE = 3,REASON_ASSOC_EXPIRE …

基于uniapp与uview做一个按拼音首字母排序的通讯录页面

效果图&#xff1a; 第一步导入pinyin库并应用&#xff0c;用于区分汉字的拼音首字母 npm i pinyin import pinyin from "pinyin" 完整算法&#xff1a; function getListByPinyinFirstLetter(data) {const newList {};for (const item of data) {let firstLett…

AI全栈大模型工程师(十四)数据连接封装

文章目录 二、数据连接封装2.1 文档加载器:Document Loaders2.2 文档处理器2.3 文档向量化:Text Embeddings2.4 向量的存储(与索引):Vectorstores2.5 向量检索:Retrievers后记二、数据连接封装 2.1 文档加载器:Document Loaders !pip install pypdffrom langchain.docu…

MICCAI2023论文多模态论文速读-1

文章目录 1.Attentive Deep Canonical Correlation Analysis for Diagnosing Alzheimer’s Disease Using Multimodal Imaging Genetics2.Bidirectional Mapping with Contrastive Learning on Multimodal Neuroimaging Data3.CoLa-Diff: Conditional Latent Diffusion Model f…

ruoyi系统改造

前端启动报错&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 修改ruoyi-ui/package.json&#xff0c;添加export NODE_OPTIONS–openssl-legacy-provider && "scripts": {"dev": "export NODE_OPTIONS--openssl…

C#Onnx模型信息查看工具

效果 Netron效果 项目 代码 using Microsoft.ML.OnnxRuntime; using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string…

性能测试怎么入门?一文7个知识点带你成功入门

一、相关概念 1、性能测试相关&#xff1a;负载测试&#xff0c;性能测试&#xff0c;压力测试&#xff0c;稳定性测试&#xff0c;全链路测试等 2、性能指标&#xff1a;吞吐率&#xff0c;tps&#xff0c;并发用户数&#xff0c;吞吐量&#xff0c;响应时间等 二、性能测试…

colly库的爬虫程序

使用colly库的爬虫程序&#xff0c;该程序将使用Go语言爬取内容。 package main ​ import ("fmt""log" ​"github.com/gocolly/colly" ) ​ func main() {// 创建一个Colly爬虫实例c : colly.NewCrawler() ​// 设置服务器c.OnRequest(func(r …

我做云原生的那几年

背景介绍 在2020年6月&#xff0c;我加入了一家拥有超过500人的企业。彼时&#xff0c;前端团队人数众多&#xff0c;有二三十名成员。在这样的大团队中&#xff0c;每个人都要寻找自己的独特之处和核心竞争力。否则&#xff0c;你可能会沉没于常规的增删改查工作中&#xff0…

Redis配置多个端口记录

一、背景&#xff1a; 使用Redis做WEB系统缓存&#xff0c;如登录信息、数据字典 等 键值对信息&#xff1b;存在多个测试环境及开发连接使用默认的6379端口&#xff0c;易造成Key重复&#xff0c;缓存紊乱&#xff0c;网络堵塞&#xff1b; 额外增开6380、6381端口&#xff0c…

翻页电子版照片书如何制作?

在漫长的生命长河里&#xff0c;经常会拍很多漂亮的照片&#xff0c;这些照片可以收集起来做成相册&#xff0c;也可以制作成照片书&#xff0c;无论是当作礼物送给家人朋友&#xff0c;还是留着自己细细品味欣赏&#xff0c;都非常的有意义。 如今市面上制作翻页照片书的线上平…

ruoyi框架前端修改message消失时间

修改教程 打开modal.js文件&#xff0c;找到Message.success&#xff0c;然后把参数设置进去就行。单位是10001秒。 // 可以设置的参数如下export interface ElMessageOptions {/** Message text */message: string | VNode/** Message type */type?: MessageType/** Custom …

《C Primer Plus(第6版)》中文版PDF电子版下载(免费)

作者&#xff1a;史蒂芬普拉达&#xff08;Stephen Prata&#xff09;[美]译者&#xff1a;姜佑出版社&#xff1a;人民邮电出版社出版时间&#xff1a;2019年11月01日页码&#xff1a;541总字数&#xff1a;107.6W 这是一本经典的 C 语言书籍&#xff0c;至今已经迭代了 6 个…