Java代码调用https(SSL证书验证问题)

Java代码调用https接口SSL证书验证问题

现有一个https接口,如下

@Test
public void test1() {String url = "https://iservericloudhx.yndk.cn:32613/iserver/services/map-mongodb-C_YGYX_530000_2022/wms111/C_YGYX_530000_2022";RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url, String.class);log.info("-----map get ----- reponse {}", response);
}

直接执行代码,会报如下错误

threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://iservericloudhx.yndk.cn:32613/iserver/services/map-mongodb-C_YGYX_530000_2022/wms111/C_YGYX_530000_2022": PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target] with root causesun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:1.8.0_261]at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:1.8.0_261]at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_261]at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434) ~[na:1.8.0_261]at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306) ~[na:1.8.0_261]at sun.security.validator.Validator.validate(Validator.java:271) ~[na:1.8.0_261]

这是因为Java在访问SSL加密的网站时,需要从JDK的KeyStore(存储位置为%JAVA_HOME%\jre\lib\security\cacerts)里面查找相对应的证书,如果不能找到就会报以上错误!

如何解决这个问题呢?

方式1:绕过SSL证书验证。

// 如果使用的是 apache 的http工具
String url = "https://xxx";
HttpClient httpClient = SkipHttpsUtil.wrapClient();
HttpGet httpGet = new HttpGet(url);
try {HttpResponse response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();if (ObjectUtil.isNull(entity)) {return null;}String res = EntityUtils.toString(entity, "utf-8");return JSON.parseObject(res);
} catch (Exception ex) {ex.printStackTrace();log.error("execute error ---> ", ex);
}// 如果使用的 RestTemplate
// 重写SimpleClientHttpRequestFactory类
/*** @description:* @author: laizhenghua* @date: 2022/8/24 11:16*/
public class RequestFactory extends SimpleClientHttpRequestFactory {@Overrideprotected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {if (connection instanceof HttpsURLConnection) {prepareHttpsConnection((HttpsURLConnection) connection);}super.prepareConnection(connection, httpMethod);}private void prepareHttpsConnection(HttpsURLConnection connection) {connection.setHostnameVerifier(new SkipHostnameVerifier());try {connection.setSSLSocketFactory(createSslSocketFactory());} catch (Exception ex) {// Ignore}}private SSLSocketFactory createSslSocketFactory() throws Exception {javax.net.ssl.SSLContext context = javax.net.ssl.SSLContext.getInstance("TLS");context.init(null, new TrustManager[] { new SkipX509TrustManager() }, new SecureRandom());return context.getSocketFactory();}private class SkipHostnameVerifier implements HostnameVerifier {@Overridepublic boolean verify(String s, SSLSession sslSession) {return true;}}private static class SkipX509TrustManager implements X509TrustManager {@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}}
}// 重新封装RestTemplate实例
/*** @description:* @author: laizhenghua* @date: 2022/7/29 17:04*/
@Configuration
public class RestTemplateConfiguration {@Beanpublic RestTemplate restTemplate() {RequestFactory factory = new RequestFactory(); // 这里RequestFactory就是上述重写的factory.setReadTimeout(30000);factory.setConnectTimeout(30000);return new RestTemplate(factory);}
}

方式2:将所访问的SSL站点证书从浏览器导出,并通过keytool命令导入到JDK的证书库中。

1、先从浏览器导出SSL证书(详见下图)
在这里插入图片描述
在这里插入图片描述
会得到一个证书文件!

2、将证书文件导入到JDK的证书库中,详见以下命令

# 注意点1: keytool 命令如果使用不了,就从Java安装bin目录cmd进行操作,如 cmd E:\jdk1.8\bin
# 注意点2:执行 keytool 命令会提示"输入密钥库口令:" 口令是changeit 如下
# C:\Users\赖正华>keytool -list -alias _.yndk.cn -v -keystore "%JAVA_HOME%\jre\lib\security\cacerts"
# 输入密钥库口令: changeit# 导入
keytool -import -alias _.yndk.cn -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file E:\_.yndk.cn.crt
# -alias 指定证书别名一般设置域名即可
# -keystore 指定证书导入位置
# -file 指定证书文件(就是浏览器导出的证书文件)# 删除
keytool -delete -alias _.yndk.cn -keystore "%JAVA_HOME%\jre\lib\security\cacerts"# 查看
keytool -list -alias _.yndk.cn -v -keystore "%JAVA_HOME%\jre\lib\security\cacerts"

导入证书后我们再来访问https接口,就不报错了。

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

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

相关文章

Docker 里面按照ifconfig

1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping

[Linux]Vi和Vim编辑器

Vi和Vim编辑器 Linux系统会内置vi文本编辑器, 类似于windows中的记事本 Vim具有程序编辑的能力, 可以看作是Vi的增强版本, 可以进行语法检查, 代码补全,代码编译和错误调整等功能 Vi和Vim的模式 快速入门 使用vim开发一个Hello.java程序 通过Xshell连接Linux系统命令行输入…

【Qt | QAction】Qt 的 QAction 类介绍

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

Python 类class的用法详解

Python 是一门支持面向对象编程的语言,类(class)是面向对象编程的基本概念之一。通过类,我们可以封装数据和方法,实现代码的模块化、可重用和可维护。本文将详细介绍 Python 中类的用法,包括类的定义、继承…

Graph Clustering和Community Detection(附代码) 图谱

本次我们聚焦算法的部分。这篇论文的算法之所以效果高于其他组别,核心思想就在于:1)从多个角度加权计算了用户之间的相似度;2)根据两两之间的相似度进行了Graph Clustering。最终的效果就是有相同偏好的用户被聚在了同一组,那么既然大家兴趣类似,你喜欢的自然大概率也是…

【Taro】初识 Taro

笔记来源:编程导航。 概述 Taro 官方文档:https://taro-docs.jd.com/docs/ (跨端开发框架) Taro 官方框架兼容的组件库: taro-ui:https://taro-ui.jd.com/#/ (最推荐,兼容性最好&…

组件封装有哪些注意事项—面试常问优美回答

组件封装有哪些注意事项—面试常问优美回答 关键点及回答建议与代码案例 组件设计原则 关键点:高内聚低耦合、接口清晰、职责单一。回答建议: “在设计组件时,我遵循高内聚低耦合的原则,确保组件内部逻辑紧密相关,同…

7.搭建个人金融数据库之快速获取股票列表和基本信息!

前边我们提过,免费的数据一般来自于爬虫,获取难度和维护成本都比较高,其实不太适合小白用户。所以非必要情况下,我们尽量不用这种方式来获取数据。 我自己用的比较多的是tushare,一般来说有它也就够了,大…

Python自动化-操作Excel

在数据处理和报表生成过程中,Excel是一个经常使用的工具。Python中的openpyxl库可以让您通过编程方式读取、写入和操作Excel文件,从而实现自动化的数据处理和报表生成。本文将介绍openpyxl库的基本用法和常见操作,帮助您快速上手使用Python处…

神经生物学精解【2】

文章目录 神经系统动物神经系统概述一、神经系统的基本组成二、神经系统的分类三、神经系统的功能四、神经系统的特殊能力 中枢神经系统组成一、中枢神经系统的构成1. 脑2. 脊髓 二、各部分功能、性质1. 大脑2. 间脑3. 小脑4. 脑干5. 脊髓 三、例题 神经系统可塑性一、定义与概…

猿大师办公助手在线编辑Office为什么要在客户端电脑安装插件微软Office或金山WPS?

猿大师办公助手作为一款专业级的网页编辑Office方案,与在线云文档方案(飞书、腾讯文档等)不同,需要在客户端电脑安装猿大师办公助手插件及微软Office或者金山WPS软件,很多客户不理解为什么要这么麻烦,能否客…

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示

效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…

SQL Server全方位指南:从入门到高级详解

本文将分为三大部分&#xff0c;逐步深入SQL Server的基础知识、进阶技巧和高级特性&#xff0c;旨在帮助从初学者到经验丰富的开发人员深入理解和使用SQL Server。 一、入门篇 1.1 什么是SQL Server&#xff1f; SQL Server 是由微软开发的关系型数据库管理系统&#xff08…

VMWare虚拟机安装CentOS-7-x86_64-DVD-1611操作系统

VMWare虚拟机安装CentOS7操作系统 1、虚拟机准备打开VMware单机创建新的虚拟机典型与自定义安装选择虚拟机硬件兼容性选择安装程序光盘映射文件(iso)选择客户机操作系统命名虚拟机处理器配置内存配置网络连接类型I/O类型选择磁盘类型选择磁盘指定磁盘的最大磁盘大小磁盘名称我们…

ClickHouse在AI领域的结合应用

文章目录 引言1.1 人工智能与大数据的融合1.2 ClickHouse在大数据平台中的地位2.1 BI与AI的融合从传统BI到智能BIAI赋能BI融合的优势实际应用案例 2.2 异构数据处理的重要性数据多样性的挑战异构数据处理的需求技术实现实际应用案例 2.3 向量检索与AIOps技术向量检索的背景AIOp…

SpringBoot权限认证-Sa-Token的使用与详解

本文详细介绍了Sa-Token在Java项目中的使用方法&#xff0c;包括Sa-Token的基本概念、与其他权限框架的比较、基本语法和高级用法&#xff0c;并通过实例讲解了如何在项目中集成和使用Sa-Token。作为一款轻量级Java权限认证框架&#xff0c;Sa-Token在简化权限管理、提高开发效…

JS中的for...in和for...of有什么区别?

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在 JavaScript 中&#xff0c;for...in 和 for...of 是两种用于遍历数组&#xff08;或其他可迭代对象&#xff09;的循环语句&#xff0c;但它们之间存在显著的差异。 一、遍历数组 for…in const arr …

[性能]高速收发的TCP/MQTT通信

Nagle算法‌是一种TCP/IP协议中的优化算法&#xff0c;旨在减少小数据包的数量&#xff0c;从而减少网络拥塞的可能性。该算法规定&#xff0c;在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后&#xff0c;如果收到确认&#xff08;ACK&#xff09;之前&#x…

10 while和unitl循环结构语句

while和unitl循环结构语句 一、循环结构语句 ​ Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式&#xff0c;有三种常用的循环语句&#xff1a;for、while和until。while循环和for循环属于“当型循环”&#xff0c;而until属于“直到型循环”。 二、详解…

永磁电机和普通电机优缺点

永磁电机和普通电机&#xff08;如异步电机或同步电机&#xff09;各有优缺点&#xff0c;具体如下&#xff1a; 永磁电机 优点&#xff1a; 高效率&#xff1a;由于永磁体提供持续的磁场&#xff0c;永磁电机通常具有更高的效率。 体积小、重量轻&#xff1a;相对于功率&a…