RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message 报错解决

这篇具有很好参考价值的文章主要介绍了RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message 报错解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

错误信息:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://www.baidu.com": Unsupported or unrecognized SSL message
	at org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:888)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:868)
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:764)
	at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:512)
	at com.zhubayi.chatgpt.controller.ChatGptController.chat(ChatGptController.java:47)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:731)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
	at java.base/sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:457)
	at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:175)
	at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
	at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510)
	at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
	at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:580)
	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:142)
	at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:75)
	at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
	at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:862)
	... 53 more

原因:RestTemplate默认是不支持HTTPS请求的,那么如果想使用RestTemplate发送一个HTTPS的请求 ,就需要对证书进行处理,这里记录一下一个可行的方法忽略证书的校验。

添加依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>

重写prepareConnection方法

使用 RestTemplateBuilder来构建一个 RestTemplate,而非使用默认。requestFactory()方法用来设置 ClientHttpRequestFactorySimpleClientHttpRequestFactorySpring内置的默认实现,实现了 ClientHttpRequestFactory接口,我们需要重写其 prepareConnection()方法,在此方法里实现对 HttpURLConnection的重新处理,忽略对证书的校验。

代码:

public class HttpsClientHttpRequestFactory extends SimpleClientHttpRequestFactory {
    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
        try {
            if (connection instanceof HttpsURLConnection) {// https协议,修改协议版本
                KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
                // 信任任何链接,忽略对证书的校验
                TrustStrategy anyTrustStrategy = (x509Certificates, s) -> true;
                //自定义SSLContext
                SSLContext ctx = SSLContexts.custom().loadTrustMaterial(trustStore, anyTrustStrategy).build();
                // ssl问题
                ((HttpsURLConnection) connection).setSSLSocketFactory(ctx.getSocketFactory());
                //解决No subject alternative names matching IP address xxx.xxx.xxx.xxx found问题
                ((HttpsURLConnection) connection).setHostnameVerifier((s, sslSession) -> true);
                HttpsURLConnection httpsConnection = (HttpsURLConnection) connection;
                super.prepareConnection(httpsConnection, httpMethod);
            } else { // http协议
                super.prepareConnection(connection, httpMethod);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

放入到容器中文章来源地址https://www.toymoban.com/news/detail-504084.html

  @Bean
    public RestTemplate restTemplate() {
        return  new RestTemplateBuilder()
                .requestFactory(HttpsClientHttpRequestFactory::new)
                //basic认证
                //.basicAuthentication("username", "password")
                .build();
    }

到了这里,关于RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message 报错解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【异常】客户端发起HTTPS请求报错,服务端返回400 Bad Request ,并且提示No required SSL certificate was sent

    HTTP响应码400表示客户端发送了一个无效的请求。这可能是由于请求中缺少必需的参数或格式不正确等原因导致的。服务器无法处理此请求并返回400响应码。如果您正在编写Web应用程序,建议在处理请求时检查请求的有效性,并在必要时返回400响应码以指示客户端请求无效。

    2024年02月11日
    浏览(49)
  • RestTemplate发起POST请求 突然返回错误码500,但相同的请求再postman中是可以调用

    一个之前一直跑的很正常的springboot项目,RestTemplate发起POST请求 突然一直返回错误码500,但相同的请求再postman中是可以调用的。 删除RestTemplateConfig中的 factory.setBufferRequestBody(false); 即可正常调用。 注意 :网上说bufferRequestBody 是标志是否使用缓存流的形式,默认是 true,缺点

    2024年02月12日
    浏览(51)
  • restTemplate转发Https请求

    代码架构 效果

    2024年02月08日
    浏览(37)
  • HTTPS网站发起HTTP请求

    ​ Https网站中无法请求Http资源(静态资源、接口等) https网站发起的http请求会被blocked,不被允许,因此,通过设置nginx反向代理转发http请求。 我个人是采用nginx反向代理的方式,实现在https协议的网站中发送http协议的接口请求,具体的 nginx 配置请看下图: 我是 甜点cc 热爱

    2024年02月11日
    浏览(52)
  • 解锁新技能RestTemplate设置全局、单个请求超时时间及支持https请求

    springboot请求第三方接口时会用到RestTemplate,其底层实现逻辑默认是通过SimpleClientHttpRequestFactory来实现,具体由socket连接来实现;可以替换其默认实现为HttpComponentsClientHttpRequestFactory。 一、自定义RestTemplate实例对象 二、RestTemplate自定义全局超时时间 三、RestTemplate设置单个请求

    2023年04月09日
    浏览(32)
  • 【JavaSE专栏91】Java如何主动发起Http、Https请求?

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码,HTTP 是一种用于在 Web 浏

    2024年02月09日
    浏览(53)
  • https请求异常引发(Received fatal alert: unrecognized_name):如何快速解决项目中问题?

    首先我们要承认我们大部分程序员是 应用开发 ,不是操作系统、协议、框架开发等这类 底层开发者 。 本篇文章中遇到的问题个人觉得算是奇葩问题,首先代码没大问题,也许涉及到https本质问题,确实没有解决这方面问题的经验和能力。但是这个问题前前后后解决了快3天

    2024年02月10日
    浏览(34)
  • RestTemplate 请求https接口,无需证书访问,并整合工具类,细到极致

      Hello,大家好呀,我是你们的Jessica老哥,不知不觉,到了3月份了,又是一年一度的金三银四,老哥和大家一样,想换工作,于是呢,更新资料,投简历。试想着把自己的劳动价值卖的更高一点。   没想到,今年好像行情有点不太对劲呀,往年跟HR打个招呼,人家还会要你

    2024年02月08日
    浏览(47)
  • HTTPS请求忽略SSL证书

    现场环境: 后端服务部署在docker内,远程调用https接口,线上报错: unable to find valid certification path to requested target 解决方案: 设置SSLSocketFactory忽略证书校验 实现案例: 使用的cn.hutool.http.HttpRequest工具类请求的数据,支持设置头部、表单、body、超时时间等关键信息 工具类 SSL

    2024年02月11日
    浏览(50)
  • restTemplate发送https请求报错I/O error on POST request for “xxxx“: Remote host terminated the handshake解决

    最近在项目开发中遇到了一个问题,用restTemplate调用https接口的时候一直掉不通,报错I/O error on POST request for “xxxx”: Remote host terminated the handshake;nested exception is javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake 远程主机终止了握手 一开始以为是SSL证书的问题。在百度

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包