Spring Boot RestTemplate请求证书问题

Spring Boot RestTemplate请求证书问题


场景

GG!忙活了一个月的需求正式上线,第一天就嗷嗷报错,没一条数据是请求成功的。因为程序里插入了监控程序,监控程序报错,毕竟这个项目刚开始引入都是后台处理,不添加监控程序真报错谁也不知道。如果查过10次报错就会发送提示邮件,告诉我们大面积报错了,赶紧处理。大清早的领导就哐哐@我们。程序报错邮件发了,赶紧去看!


报错描述

org.springframework.web.client.ResourceAccessException:
	I/O error on POST request for "https://xxxxx.com": 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:

原因

由于该网站的SSL证书不受信,所以才会报这个错误。但是测试环境好的,很头秃!


解决

其实有三种解决方案:

  • 信任所有证书:本次是这么解决的,由于是内网走代理,请求的url固定。
	@Bean
    public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
   
        return new RestTemplate(generateHttpRequestFactory());
    }

    private HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
            throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException
    {
   
        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());

        HttpClientBuilder httpClientBuilder = HttpClients.custom();
        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
        CloseableHttpClient httpClient = httpClientBuilder.build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setHttpClient(httpClient);
        return factory;
    }

有可能你引入的包找不到相对应的依赖,需要引入apache的请求包:

implementation 'org.apache.httpcomponents:httpclient:4.5.1'
  • 将不信任的证书加入到JVM默认信任证书
  • 单独为不信任的网站生成证书并在项目中指定

后面这两种比较类似,都需要使用keytool 工具,但是对此项目来讲不是很合适,所以目前只使用第一种。其他两种后面用到了再具体补充。

补充

之前也遇到一个报错也是这么解决的

I/O error on POST request for "https://xxxx.com": java.security.cert.CertificateException: No subject alternative DNS name matching test.xxxxxxx.com found.;

记录一下

赶紧跑路!

相关推荐

  1. Spring Boot RestTemplate请求证书问题

    2024-02-07 21:12:02       52 阅读
  2. npm证书过期问题

    2024-02-07 21:12:02       25 阅读
  3. https方式请求 且过滤证书

    2024-02-07 21:12:02       60 阅读
  4. HTTPS 请求中的证书验证详解(Python版)

    2024-02-07 21:12:02       65 阅读
  5. okHttp的https请求忽略ssl证书认证

    2024-02-07 21:12:02       26 阅读
  6. 使用个人p12证书请求https接口数据

    2024-02-07 21:12:02       30 阅读
  7. Https post 请求时绕过证书验证方案

    2024-02-07 21:12:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-07 21:12:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-07 21:12:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-07 21:12:02       82 阅读
  4. Python语言-面向对象

    2024-02-07 21:12:02       91 阅读

热门阅读

  1. 谈谈开源软件的影响力

    2024-02-07 21:12:02       47 阅读
  2. docker实际生产中遇到的问题及解决办法

    2024-02-07 21:12:02       71 阅读
  3. docker进阶问题二

    2024-02-07 21:12:02       43 阅读
  4. docker 安装mysql

    2024-02-07 21:12:02       50 阅读
  5. netstat: 未找到命令

    2024-02-07 21:12:02       56 阅读
  6. MFC研发自验用例编写应注意哪些关键测试点

    2024-02-07 21:12:02       44 阅读
  7. C入门番外篇——C, Are you OK?

    2024-02-07 21:12:02       46 阅读
  8. Unity类银河恶魔城学习记录4-3 P56 On Hix FX源代码

    2024-02-07 21:12:02       46 阅读