当前位置: 首页 > news >正文

RestTemplate Https 证书访问错误

错误信息

resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

这个错误是由于 SSL/TLS 握手失败引起的,具体原因是服务器的 SSL 证书无效或不受信任。错误信息 No subject alternative names present 表示服务器的证书中没有包含与请求的域名匹配的主题备用名称(Subject Alternative Name, SAN)。

以下是解决此问题的几种方法:

1. 检查服务器证书

确保服务器的 SSL 证书是有效的,并且包含正确的主机名(即请求的域名)。可以通过以下步骤检查证书:

  • 使用浏览器访问服务器的 URL(例如 https://21.24.6.6:9443),查看证书的详细信息。

  • 确保证书的 Subject Alternative Name (SAN) 包含请求的域名或 IP 地址。

如果证书无效或不匹配,需要联系服务器管理员更新证书。

2. 忽略 SSL 证书验证(仅用于测试环境)

在生产环境中不建议使用此方法,但在测试环境中可以临时忽略 SSL 证书验证。

使用 RestTemplate 忽略 SSL 验证

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;public class RestTemplateExample {public static void main(String[] args) throws Exception {// 创建忽略 SSL 验证的 RestTemplateRestTemplate restTemplate = createRestTemplateWithIgnoreSSL();// 发送请求String url = "https://21.24.6.6:9443/authn-api/v5/oauth/token";String response = restTemplate.getForObject(url, String.class);System.out.println("Response: " + response);}private static RestTemplate createRestTemplateWithIgnoreSSL() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {// 创建 SSLContext,忽略证书验证SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true) // 信任所有证书.build();// 创建 HttpClientCloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 忽略主机名验证.build();// 创建 RestTemplateHttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory(httpClient);return new RestTemplate(requestFactory);}
}

3. 使用自定义信任库

如果服务器使用的是自签名证书或私有 CA 签发的证书,可以将证书导入 Java 的信任库(cacerts)或自定义信任库。

步骤:

  1. 导出服务器的证书:

    • 使用浏览器访问服务器的 URL,导出证书(通常为 .crt 或 .pem 格式)。

    • 或者使用 openssl 命令导出证书:

openssl s_client -connect 21.24.6.6:9443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > server.crt
  1. 将证书导入 Java 信任库:
    • 找到 Java 的默认信任库(通常位于$JAVA_HOME/lib/security/cacerts)。

    • 使用 keytool 将证书导入信任库:

keytool -import -trustcacerts -file server.crt -keystore $JAVA_HOME/lib/security/cacerts -alias server_cert
- 默认密码是 changeit。
  1. 配置 RestTemplate 使用自定义信任库:
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.security.KeyStore;public class RestTemplateExample {public static void main(String[] args) throws Exception {// 创建使用自定义信任库的 RestTemplateRestTemplate restTemplate = createRestTemplateWithCustomTrustStore();// 发送请求String url = "https://21.24.6.6:9443/authn-api/v5/oauth/token";String response = restTemplate.getForObject(url, String.class);System.out.println("Response: " + response);}private static RestTemplate createRestTemplateWithCustomTrustStore() throws Exception {// 加载自定义信任库KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());try (FileInputStream fis = new FileInputStream("path/to/truststore.jks")) {trustStore.load(fis, "password".toCharArray());}// 创建 SSLContextSSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(trustStore, null) // 使用自定义信任库.build();// 创建 HttpClientCloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();// 创建 RestTemplateHttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory(httpClient);return new RestTemplate(requestFactory);}
}

4. 检查服务器配置

如果服务器配置了 SNI(Server Name Indication),确保客户端支持 SNI。某些旧版本的 Java 可能不支持 SNI,可以尝试升级 Java 版本。

5. 使用 WebClient 替代 RestTemplate

如果使用的是 Spring WebFlux,可以考虑使用 WebClient,它提供了更灵活的 SSL 配置选项。
示例:

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;public class WebClientExample {public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException {// 创建忽略 SSL 验证的 WebClientWebClient webClient = WebClient.builder().baseUrl("https://21.24.6.6:9443").build();// 发送请求Mono<String> response = webClient.get().uri("/authn-api/v5/oauth/token").retrieve().bodyToMono(String.class);response.subscribe(body -> System.out.println("Response: " + body));}
}

总结

  • 如果服务器证书无效或不匹配,需要更新证书。
  • 在测试环境中可以临时忽略 SSL 验证,但不建议在生产环境中使用。
  • 对于自签名证书或私有 CA 签发的证书,可以将证书导入 Java 信任库或自定义信任库。
  • 如果问题仍然存在,可以尝试使用 WebClient 替代 RestTemplate。

相关文章:

RestTemplate Https 证书访问错误

错误信息 resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.c…...

MySQL内存使用率高且不释放问题排查与总结

背景 生产环境mysql 5.7内存占用超过90%以上&#xff0c;且一直下不来。截图如下&#xff1a; 原因分析 1、确定mysql具体的占用内存大小&#xff0c;通过命令&#xff1a;cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多&#xff08;其他参数的含义想了解可参考这…...

mysql8 从C++源码角度看sql生成抽象语法树

在 MySQL 8 的 C 源码中&#xff0c;SQL 语句的解析过程涉及多个步骤&#xff0c;包括词法分析、语法分析和抽象语法树&#xff08;AST&#xff09;的生成。以下是详细的解析过程和相关组件的描述&#xff1a; 1. 词法分析器&#xff08;Lexer&#xff09; MySQL 使用一个称为…...

【DeepSeek】DeepSeek概述 | 本地部署deepseek

目录 1 -> 概述 1.1 -> 技术特点 1.2 -> 模型发布 1.3 -> 应用领域 1.4 -> 优势与影响 2 -> 本地部署 2.1 -> 安装ollama 2.2 -> 部署deepseek-r1模型 1 -> 概述 DeepSeek是由中国的深度求索公司开发的一系列人工智能模型&#xff0c;以其…...

【C++】多态原理剖析

目录 1.虚表指针与虚表 2.多态原理剖析 1.虚表指针与虚表 &#x1f36a;类的大小计算规则 一个类的大小&#xff0c;实际就是该类中成员变量之和&#xff0c;需要注意内存对齐空类&#xff1a;编译器给空类一个字节来唯一标识这个类的对象 对于下面的Base类&#xff0c;它的…...

【Rust自学】20.4. 结语:Rust学习一阶段完成+附录

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 20.4.1. 总结 Rust初级学习之旅终于完成了&#xff01;恭喜&#xff01; 包括这篇文章&#xff0c;我们使用了110篇文章来学习Rust。 真…...

pytorch引用halcon写数据集

****加粗样式虽然啰嗦一点&#xff0c;但好歹halcon自己熟悉&#xff0c;不会忘记&#xff0c;用os 和 pil会导致脑子记得东西太多 import halcon as ha import torch from torch.utils.data import Datasetpath0 rE:\BaiduNetdiskDownload\cell class MyDataset(Dataset):de…...

让文物“活”起来,以3D数字化技术传承文物历史文化!

文物&#xff0c;作为不可再生的宝贵资源&#xff0c;其任何毁损都是无法逆转的损失。然而&#xff0c;当前文物保护与修复领域仍大量依赖传统技术&#xff0c;同时&#xff0c;文物管理机构和专业团队的力量相对薄弱&#xff0c;亟需引入数字化管理手段以应对挑战。 积木易搭…...

aarch64 Ubuntu20.04 安装docker

安装 docker 依赖项&#xff1a;sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release添加 Docker GPG 密钥&#xff1a;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyr…...

JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南

1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互&#xff0c;可以发送 GET、POST 等各种请求类型&#xff0c;并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...

Mac上搭建k8s环境——Minikube

1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…...

经典排序算法复习----C语言

经典排序算法复习 分类 交换类 冒泡快排 分配类 计数排序基数排序 选择类 选择排序 堆排序 归并类 归并排序 插入类 直接插入排序 希尔排序 折半插入排序 冒泡排序 基于交换。每一轮找最大值放到数组尾部 //冒泡排序 void bubSort(int* arr,int size){bool sorte…...

自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同

目录 1、引言 2、主要内容 2.1、定位对比&#xff1a;感知与规划的全维覆盖 2.2、数据与技术特性对比 2.3、技术协同&#xff1a;构建全栈研发生态 2.4、应用场景与评估体系 2.5、总结与展望 3、参考文献 1、引言 随着自动驾驶技术向全栈化迈进&#xff0c;Motional 团…...

[LUA ERROR] bad light userdata pointer

Cocos2d项目&#xff0c;targetSdkVersion30&#xff0c;在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer &#xff0c;导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...

【Java八股】JVM

JVM 1. jvm内存区域分为哪些部分 线程私有的&#xff1a;程序计数器、虚拟机栈、本地方法栈 程序计数器&#xff1a;指示当前线程执行到的字节码文件的行号&#xff0c;是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈&#xff1a;用于存储方法调用的数据&…...

集成学习(一):从理论到实战(附代码)

一、引言 在机器学习领域&#xff0c;打造一个独立、强大的算法是解决问题的关键。然而&#xff0c;集成学习提供了一种不同的视角&#xff1a;通过组合多个“弱”学习器来创建一个更强大的模型。本文探讨集成学习的思想、方法及其应用。 二、机器学习 vs 集成学习思想 传统…...

Netty:高性能网络应用框架的深度解析

引言 Netty 是由 JBoss 提供的一个开源的 Java NIO 客户端/服务器框架&#xff0c;它用以快速开发网络应用程序&#xff0c;如协议服务器和客户端。它的设计目标是提供异步事件驱动的网络应用程序框架&#xff0c;支持高效的网络通信和数据处理。Netty 在性能、可扩展性、安全…...

神经网络常见激活函数 3-ReLU函数(修正线性单元)

文章目录 ReLU函数求导函数和导函数图像优缺点pytorch 中的 ReLU 函数tensorflow 中的ReLU函数 ReLU 修正线性单元 &#xff08;Rectified Linear Unit&#xff09; 函数求导 ReLU函数 ReLU ⁡ max ⁡ ( 0 , x ) { x x ≥ 0 0 x < 0 \begin{aligned} \operatorname{ReL…...

Android开发获取缓存,删除缓存

Android开发获取缓存&#xff0c;删除缓存 app设置中往往有清理缓存的功能。会显示当前缓存时多少&#xff0c;然后可以点击清理缓存 直接上代码&#xff1a; object CacheHelper {/*** 获取缓存大小* param context* return* throws Exception*/JvmStaticfun getTotalCache…...

如何通过PHP接入DeepSeek的API

想知道如何通过PHP接入DeepSeek的API。看起来他对之前的Python步骤比较熟悉&#xff0c;但这次想用PHP实现。 首先&#xff0c;我需要回顾一下DeepSeek API的文档&#xff0c;确认它支持哪些方法和参数。假设用户已经配置了环境变量&#xff0c;比如API密钥&#xff0c;接下来…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...