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;}}

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

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

相关文章

【LeetCode】剑指 Offer <二刷>(6)

目录 题目&#xff1a;剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 13. 机器人的运动范围 - 力扣&#…

自然语言处理(七):来自Transformers的双向编码器表示(BERT)

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种预训练的自然语言处理模型&#xff0c;由Google于2018年提出。它是基于Transformer模型架构的深度双向&#xff0…

JavaScript基础知识总结

目录 一、js代码位置 二、变量与数据类型 1、声明变量 2、基本类型&#xff08;7种基本类型&#xff09; 1、undefined和null 2、String ⭐ 模板字符串&#xff08;Template strings&#xff09; 3、number和bigint ⭐ 4、boolean ⭐ 5、symbol 3、对象类型 1、Fun…

Google云数据库的“Enterprise“和“Enterprise Plus“版怎么选

最近&#xff0c;Google Cloud SQL&#xff08;Google云上的RDS&#xff09;做了一次大的产品调整与发布&#xff1a;将原来的Cloud SQL分为了两个版本&#xff0c;分别为"Enterprise"和"Enterprise Plus"版本。本文概述了两个版本的异同&#xff0c;以帮助…

【论文爬虫】自动将论文详细信息直送notion并自动下载(含源码)

输入论文标题&#xff0c;本爬虫将自动在semanticscholar.com和arxiv.com搜索该文章&#xff0c;自动获取其日期、作者、url、摘要等信息&#xff0c;并自动发送到你提前设置好的notion数据库里&#xff0c;同时自动从arxiv下载论文&#xff0c;然后将论文的保存地址在notion页…

Python算法练习 9.11

leetcode 392 判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcd…

mysql文档--myisam存储引擎--myisam引擎全解--底层探索

阿丹&#xff1a; myisam存储引擎与innodb存储引擎战争&#xff0c;在mysql中5.5.5之前myisam还是mysql的默认存储引擎但是在5.5.5版本之后被innodb反超。 官方解释&#xff1a; MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;&#xff0c;由早期的ISAM所改…

时间复杂度与空间复杂度详解

时间复杂度与空间复杂度详解&#x1f996; 一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的定义2.2 大O的渐进表示法2.3 如何记录表示算法复杂度 三、空间复杂度3.1 空间复杂度的定义3.2 小试牛刀 一、算法效率 1.1 如何衡量一个算法…

PlantUML——类图(持续更新)

前言 在分析代码流程中&#xff0c;我们常常会使用到各种UML图&#xff0c;例如用例图、时序图和类图等&#xff0c;以往使用ProcessOn或亿图图示等工具&#xff0c;但是这些工具难以规范化&#xff0c;有没有一种用代码来生成图形的工具呢&#xff1f; 刚好在出差的晨会中机缘…

Day 36 贪心算法 part05 : 435. 无重叠区间 763.划分字母区间 56. 合并区间

56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;inte…

springboot MongoDB 主从 多数据源

上一篇&#xff0c;我写了关于用一个map管理mongodb多个数据源&#xff08;每个数据源&#xff0c;只有单例&#xff09;的内容。 springboot mongodb 配置多数据源 临到部署到阿里云的测试环境&#xff0c;发现还需要考虑一下主从的问题&#xff0c;阿里云买的数据库&#x…

华为OD:VLAN资源池

题目描述&#xff1a; VLANO 是一种对局域网设备进行逻辑划分的技术&#xff0c;为了标识不同的VLAN&#xff0c;引入VLAN ID(1-4094之间的整数)的概念。 定义一个VLAN ID的资源池&#xff08;下称VLAN资源池&#xff09;&#xff0c;资源池中连续的VLAN用开始VLAN-结束VLAN表…

vue+springboot+mysql的垃圾分类管理系统

1、引言 设计结课作业,课程设计无处下手&#xff0c;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;数据库&#xff0c;java&#xff0c;python&#xff0c;vue&#xff0c;html作业复杂工程量过大&#xff1f;毕设毫无头绪等等一系列问题。你想要解决的问题&am…

离散性行业介绍及与MES系统的好处

离散型行业是指那些生产、制造或提供一种有形产品或明确定义的服务的行业&#xff0c;这些产品或服务通常可以分为离散的单位&#xff0c;而且它们的生产通常遵循一定的工序或流程。与连续型行业不同&#xff0c;离散型行业的生产过程通常是间断的&#xff0c;而不是连续的。 …

什么是lockbit勒索病毒,中了勒索病毒怎么办?勒索病毒解密,数据恢复

lockbit是一种勒索病毒&#xff0c;是一种极具破坏性的电脑病毒&#xff0c;它利用加密技术来锁定用户文件&#xff0c;并以此为条件向用户勒索钱财。lockbit病毒的传播方式有通过电子邮件附件、恶意网站、点对点网络等多种途径进行传播。这种病毒一旦侵入电脑系统&#xff0c;…

vite搭建vue3项目

参考视频 1.使用npm搭建vite项目,会自动搭建vue3项目 npm create vitelatest yarn create vite2.手动搭建vue3项目 创建一个项目名称的文件夹执行命令&#xff1a;npm init -y 快速的创建一个默认的包信息安装vite: npm i vite -D -D开发环境的依赖 安装vue,现在默认是vue3.…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(9 月 11 日论文合集)

文章目录 一、检测相关(1篇)1.1 SegmentAnything helps microscopy images based automatic and quantitative organoid detection and analysis 二、分割|语义相关(4篇)2.1 AMLP:Adaptive Masking Lesion Patches for Self-supervised Medical Image Segmentation2.2 Grouping…

C++数据结构--红黑树

目录 一、红黑树的概念二、红黑树的性质三、红黑树的节点的定义四、红黑树结构五、红黑树的插入操作参考代码 五、代码汇总 一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过…

MySQL——笔试测试题

解析&#xff1a; 要查询各科目的最大分数&#xff0c;可以使用如下的SQL语句&#xff1a; SELECT coursename, MAX(score) FROM t_stuscore GROUP BY coursename; 这条SQL语句使用了MAX()聚合函数来获取每个科目的最大分数&#xff0c;并使用GROUP BY子句按照科目进行分组…

Nginx重写功能

Nginx重写功能 一、Nginx常见模块二、访问路由location2.1location常用正则表达式2.2、location的分类2.3、location常用的匹配规则2.4、location优先级排列说明2.5、location示例2.6、location优先级总结2.7、实例2.7.1、location/{}与location/{}2.7.2、location/index.html{…