springboot 请求https的私有证书验证
一、方案描述
我这里采用RestTemplate的方式调用https请求,请求第三方接口获取数据,证书由第三方私自签发的证书,我们构建的是一个springboot的API项目。
1.pom文件引入jar
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Apache HttpClient - Used to request HTTP resources over the network --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
</dependencies>
2.构建一个RestTemplateConfig
构建RestTemplateConfig为了初始化RestTemplate让它具备验证证书功能。
/*** @Author: LongGE* @Date: 2023-08-28* @Description:*/
@Configuration
public class RestTemplateConfig {/*** 1.创建一个KeyStore,并将需要信任的证书加载到KeyStore中。示例代码如下:* @return* @throws CertificateException* @throws IOException* @throws KeyStoreException* @throws NoSuchAlgorithmException*/@Beanpublic KeyStore createKeyStore() throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException {CertificateFactory certFactory = CertificateFactory.getInstance("X.509");FileInputStream inputStream =new FileInputStream("D:\\WorkSpace\\local\\online-project\\RequestSpringBoot\\src\\main\\resources\\my-certificate.crt");X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(inputStream);KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);keyStore.setCertificateEntry("my-cert", certificate);return keyStore;}/*** 2.创建一个TrustManagerFactory,使用上述创建的KeyStore来初始化它* @return* @throws CertificateException* @throws NoSuchAlgorithmException* @throws KeyStoreException* @throws IOException*/@Beanpublic TrustManagerFactory createTrustManagerFactory() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {KeyStore keyStore = createKeyStore();TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init(keyStore);return trustManagerFactory;}/*** 3.创建一个SSLContext,并使用上述创建的TrustManagerFactory来初始化它。* @return* @throws NoSuchAlgorithmException* @throws CertificateException* @throws KeyStoreException* @throws IOException* @throws KeyManagementException*/@Beanpublic SSLContext createSSLContext() throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException, KeyManagementException {TrustManagerFactory trustManagerFactory = createTrustManagerFactory();SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());return sslContext;}/*** 4.创建一个HttpsURLConnectionFactory,使用上述创建的SSLContext来设置HttpsURLConnection的SSLSocketFactory。* @return* @throws CertificateException* @throws NoSuchAlgorithmException* @throws KeyStoreException* @throws KeyManagementException* @throws IOException*/@Beanpublic RestTemplate createRestTemplate() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException {SSLContext sslContext = createSSLContext();HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();httpClientBuilder.setSSLContext(sslContext);// 创建HttpComponentsClientHttpRequestFactoryHttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();requestFactory.setHttpClient(httpClientBuilder.build());// 创建RestTemplate,并设置自定义的SSLSocketFactoryRestTemplate restTemplate = new RestTemplate(requestFactory);return restTemplate;}}
二.使用方案
这样构建好的RestTemplate,我们在Controller或者Service就可以通过@Autowried注解引入。
@RestController
@RequestMapping("/TestController")
public class TestController {@Autowiredprivate RestTemplate restTemplate;private String url = "https://www.houpu.com";private String relativePath2 = "/ResponseController/getTestMapping";@GetMapping("/test02")public String test02() {//发起请求String fullUrl2 = UriComponentsBuilder.fromHttpUrl(url).path(relativePath2).toUriString();String response2 = restTemplate.getForObject(fullUrl2, String.class);System.out.println(response2);return response2;}}
相关文章:
springboot 请求https的私有证书验证
一、方案描述 我这里采用RestTemplate的方式调用https请求,请求第三方接口获取数据,证书由第三方私自签发的证书,我们构建的是一个springboot的API项目。 1.pom文件引入jar <dependencies><dependency><groupId>org.spr…...

YOLO的基本原理详解
YOLO介绍 YOLO是一种新的目标检测方法。以前的目标检测方法通过重新利用分类器来执行检测。与先前的方案不同,将目标检测看作回归问题从空间上定位边界框(bounding box)并预测该框的类别概率。使用单个神经网络,在一次评估中直接…...

【UE 材质】制作飘动的旗帜
效果 步骤 1. 首先在建模软件中创建一个平面,注意分段数一定要多 2. 在UE中创建一个材质,这里命名为“Mat_Flag” 打开“Mat_Flag”,先将旗帜纹理连接到基础颜色 先选中导入的模型然后点击根据选中的模型预览材质 创建如下节点可以看到此时模…...

windows苹果商店上架ipa(基于appuploader)
参考文章: 上传ipa到appstore详细步骤 1、苹果商店地址:https://appstoreconnect.apple.com/apps 2、创建我的app 使用hbuilderx或apicloud云打包后,会生成一个ipa文件,而iphone是无法直接安装这个ipa文件的,需要将这…...

什么是SpringCloud Eureka服务注册与发现
😀前言 本篇博文是关于SpringCloud Eureka 介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力&…...

A Mathematical Framework for Transformer Circuits—Part (1)
A Mathematical Framework for Transformer Circuits 前言Summary of ResultsREVERSE ENGINEERING RESULTSCONCEPTUAL TAKE-AWAYS Transformer OverviewModel SimplificationsHigh-Level ArchitectureVirtual Weights and the Residual Stream as a Communication ChannelVIRTU…...

关于Maven中使用idea发布java项目的步骤:
1.新建Maven模块:...

如何使用ArcGIS Earth制作地图动画视频
通常情况下,我们所看到的地图都是静态展示,对于信息的传递,视频比图片肯定会更加丰富,所以制作地图动画视频更加有利于信息的传递,这里我们讲解一下ArcGIS Earth 2.0如何制作地图动画视频,希望能对你有所帮…...

【Linux成长史】Linux基本指令大全
🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...

ChatGPT:深度学习和机器学习的知识桥梁
目录 ChatGPT简介 ChatGPT的特点 ChatGPT的应用领域 ChatGPT的工作原理 与ChatGPT的交互 ChatGPT的优势 ChatGPT在机器学习中的应用 ChatGPT在深度学习中的应用 总结 近年来,随着深度学习技术的不断发展,自然语言处理技术也取得了显著的进步。其…...
python-基本数据类型-笔记
数字型digit:int整型 float浮点型 complex复数 布尔型bool:True False 字符串str:用一对引号(单、双、三单、三双等引号)作为定界线 列表list:[ ] 元组tuple:( ) 字典dict:{ } 由键值…...
如何使用API数据接口给自己创造收益
使用API数据接口创造收益的方法有很多,以下是一些常见的方法,并附有代码示例: 一、数据分析与预测 通过获取API数据接口中的大量数据,我们可以进行深入的数据分析,并利用这些数据来预测未来的趋势和行为。例如&#…...

第三方软件信息安全测评服务范围
安全测试 第三方软件信息安全cnas资质测评服务范围: 1、信息安全风险评估 依据《GB/T 20984-2007 信息安全技术信息安全风险评估规范》,通过风险评估项目的实施,对信息系统的重要资产、资产所面临的威胁、资产存在的脆弱性、已采取的防护措…...

测试开发 | Java 接口自动化测试首选方案:REST Assured 实践
1 . 初识 REST Assured 在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL 1.1 优点: REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的…...

vue3:13、Vue3.3新特性-defineModel
旧版本的语法 新版本语法...
如何理解C++中的void*
1.什么是void* 首先void*中的void代表一个任意的数据类型,"星号"代表一个指针,所以其就是一个任意数据类型的指针。 其实就是一个未指定跳跃力的指针。 那void*的跳跃力又什么时候指定?在需要使用的时候指定就可以了,…...

MVC,MVP,MVVM的理解和区别
MVC MVC ,早期的开发架构,在安卓里,用res代表V,activity代表Controller层,Model层完成数据请求,更新操作,activity完成view的绑定,以及业务逻辑的编写,更新view…...

【TypeScript】一直提示 :无法重新声明块范围变量
【TypeScript】一直提示 :无法重新声明块范围变量 问题描述:在VSCode中编写ts代码时,编写保存完之后,通过tsc 文件名.ts编译就会看到变量名下面出现了红色的波浪线,提示的内容是无法重新声明块范围变量。 解决方法&am…...

【python自动化】七月PytestAutoApi开源框架学习笔记(一)
前言 本篇内容为学习七月大佬开源框架PytestAutoApi记录的相关知识点,供大家学习探讨 项目地址:https://gitee.com/yu_xiao_qi/pytest-auto-api2 阅读本文前,请先对该框架有一个整体学习,请认真阅读作者的README.md文件。 本文…...

Python学习 -- logging模块
logging 模块是 Python 中用于记录日志的标准库,它提供了丰富的功能,可以帮助开发者进行日志记录和管理。以下是关于logging模块的详细使用方式,包括日志级别、处理流程、Logger 类、Handler 类、Filter 类、Formatter 类以及模块中常用函数等…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...