iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用RestTemplate调用https接口跳过证书验证
  • 515
分享到

如何使用RestTemplate调用https接口跳过证书验证

2023-06-25 11:06:30 515人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何使用RestTemplate调用https接口跳过证书验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。RestTemplate调用Https接口跳过证书验证import&

这篇文章将为大家详细讲解有关如何使用RestTemplate调用https接口跳过证书验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

RestTemplate调用Https接口跳过证书验证

import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager; import java.NIO.charset.StandardCharsets;import java.security.cert.CertificateException; import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import org.springframework.http.converter.StringHttpMessageConverter;import org.springframework.WEB.client.RestTemplate; public class NoHttpsClientUtils {         private static SSLContext createIgnoreVerifySSL() throws Exception {        SSLContext sc = SSLContext.getInstance("TLS");         // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法        X509TrustManager trustManager = new X509TrustManager() {            @Override            public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,                    String paramString) throws CertificateException {            }             @Override            public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,                    String paramString) throws CertificateException {            }             @Override            public java.security.cert.X509Certificate[] getAcceptedIssuers() {                return null;            }        };        sc.init(null, new TrustManager[] { trustManager }, null);        return sc;    }         public static RestTemplate getRestTemplate() throws Exception {        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();        // 超时        factory.setConnectionRequestTimeout(5000);        factory.setConnectTimeout(5000);        factory.setReadTimeout(5000);        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySSL(),                // 指定TLS版本                null,                // 指定算法                null,                // 取消域名验证                new HostnameVerifier() {                    @Override                    public boolean verify(String string, SSLSession ssls) {                        return true;                    }                });        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();        factory.setHttpClient(httpClient);        RestTemplate restTemplate = new RestTemplate(factory);        // 解决中文乱码问题        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));        return restTemplate;    }}

RestTemplate访问https遇到SSL证书验证错误

今天,遇到了一个SSL证书认证的问题,纠结了好久才解决,学到了很多东西,记录下来,分享给大家。

首先说一下大概的背景,我们的项目对接了第三方接口,需要向对方发送https请求。那么问题来了,https请求时需要通过SSL证书认证的,今天流程突然走不下去了,看日志发现是SSL认证的问题:

如何使用RestTemplate调用https接口跳过证书验证

在网上找资料,解决问题有两个思路:

通过相关配置,跳过SSL证书验证,完成请求。

下载证书,将证书导入到jdk的证书管理里面。

第一种方法相当于是取巧,逃避问题,我们当然不能那么做了,我们要迎接挑战,所以小编直接pass第一条,选择第二条。

添加Https证书

下载证书

先通过浏览器将未签名验证的证书保存到本地, 具体步骤:

如何使用RestTemplate调用https接口跳过证书验证

点击 不安全–> 证书–> 详细信息 --> 复制到文件 然后默认选择 起一个文件名 , 保存即可。

Mac下载:Mac找不到复制的按钮。。。只能另辟蹊径了)点地址栏上的小,然后点证书,然后将蓝色的文件拖到要下载的文件夹即可。最好给它重命名方便使用。

导入证书

我们需要将证书导入到JDK的证书管理里面才能咋项目中使用我们刚刚下载的证书。导入命令如下:

keytool -import -noprompt -trustcacerts -alias  -keystore /Users/ZHONGHUI/develop/jdk-12.0.2.jdk/Contents/Home/lib/security/cacerts -storepass changeit -file eleme.cer

其中,因为我们用的是JDK12,跟常用的JDK8目录是不一样的,所以我的cacerts目录是:/Users/ZHONGHUI/develop/jdk-12.0.2.jdk/Contents/Home/lib/security/cacerts,如果你用的是JDK1.8或者1.7的话,那么你的cacerts在jre下的 /lib/security/下。eleme是我们给复制过来的证书取得别名,eleme.cer就是我们下载改名后的证书。changeit 是密码,如果changeit不行的话,就试试changeme,一般是changeit。

生成keystore文件
keytool -import -storepass changeit -file eleme.cer -keystore eleme.keystore

然后就会生成一个eleme.keystore文件,若权限不够,加sudo即可。将它复制到项目的类路径下。

项目中配置

将下面的RestTemplateConfig替换原来的:

package com..xxx.config; import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlGorithmException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.List; import org.apache.http.config.ReGIStry;import org.apache.http.config.RegistryBuilder;import org.apache.http.conn.socket.ConnectionSocketFactory;import org.apache.http.conn.socket.PlainConnectionSocketFactory;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.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.ssl.SSLContextBuilder;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.JSON.MappingJackson2HttpMessageConverter;import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; @Configurationpublic class RestTemplateConfig {     @Autowired    private FastJsonHttpMessageConverter httpMessageConverter;     @Bean    RestTemplate restTemplate() throws Exception {    HttpComponentsClientHttpRequestFactory factory = new                                                                HttpComponentsClientHttpRequestFactory();        factory.setConnectionRequestTimeout(5 * 60 * 1000);        factory.setConnectTimeout(5 * 60 * 1000);        factory.setReadTimeout(5 * 60 * 1000);        // https        SSLContextBuilder builder = new SSLContextBuilder();        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());        ClassPathResource resource = new ClassPathResource("nonghang.keystore");        InputStream inputStream = resource.getInputStream();        keyStore.load(inputStream, null);        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()                .register("http", new PlainConnectionSocketFactory())                .register("https", socketFactory).build();        PoolingHttpClientConnectionManager phccm = new PoolingHttpClientConnectionManager(registry);        phccm.setMaxTotal(200);        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(phccm).setConnectionManagerShared(true).build();        factory.setHttpClient(httpClient);        RestTemplate restTemplate = new RestTemplate(factory);        List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();            ArrayList<HttpMessageConverter<?>> convertersValid = new ArrayList<>();            for (HttpMessageConverter<?> converter : converters) {                if (converter instanceof MappingJackson2HttpMessageConverter ||                    converter instanceof MappingJackson2XmlHttpMessageConverter) {                    continue;                }                convertersValid.add(converter);            }            convertersValid.add(httpMessageConverter);            restTemplate.setMessageConverters(convertersValid);        inputStream.close();        return restTemplate;    }}

好啦,万事俱备只欠东风,自信满满的试了一下,发现还是行不通,深受打击的我决定还是去看看导致这类报错的原因。

从根源出发,https的socket工作原理是怎样的?

https的socket工作原理流程图如下:

如何使用RestTemplate调用https接口跳过证书验证

那么,什么是SSL证书?

SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

首先,要知道导致报这个异常的原因不仅仅是因为证书校验不通过。

在我们通过https链接服务器时,服务器会给我们返回一个证书,这个证书可能经过CA认证,也可能是未认证的自制证书,客户端拿到这个证书后会对这个证书进行验证,如果是经过CA验证的证书,自然证书校验就能通过,自制证书自然就校验不同过,从而导致上边的异常。

证书校验通过后,还需要校验访问的域名是否和证书指定的域名是否匹配。未匹配也会导致如上异常。

上边两步都校验通过了才开始进行握手,但握手也有可能失败,从而导致上边的异常。

关于“如何使用RestTemplate调用https接口跳过证书验证”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何使用RestTemplate调用https接口跳过证书验证

本文链接: https://www.lsjlt.com/news/304354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用RestTemplate调用https接口跳过证书验证
    目录RestTemplate调用https接口跳过证书验证RestTemplate访问https遇到SSL证书验证错误添加Https证书下载证书导入证书生成keystore文件项目中...
    99+
    2024-04-02
  • 如何使用RestTemplate调用https接口跳过证书验证
    这篇文章将为大家详细讲解有关如何使用RestTemplate调用https接口跳过证书验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。RestTemplate调用https接口跳过证书验证import&...
    99+
    2023-06-25
  • feignclient https接口调用报证书错误怎么解决
    本篇内容主要讲解“feignclient https接口调用报证书错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“feignclient https接口调用报证书错...
    99+
    2023-06-29
  • feignclient https 接口调用报证书错误的解决方案
    目录feignclienthttps接口调用报证书错误问题当时的解决方案通过以下方式解决了HTTPS(SSL)证书下载及配置SSL证书的下载(阿里云)SSL证书的配置feigncli...
    99+
    2024-04-02
  • SpringBoot 如何使用RestTemplate来调用接口
    目录使用RestTemplate来调用接口1.新建一个配置类,配置RestTemplate的Bean2.多种传输和接收参数的方式2.1postForObject方法postForEn...
    99+
    2024-04-02
  • ssl证书如何使用
    要使用SSL证书,您需要按照以下步骤进行操作:1. 获取SSL证书:您可以从认可的证书颁发机构(CA)购买SSL证书,或者使用免费的...
    99+
    2023-08-25
    ssl证书
  • 如何使用ssl证书
    使用SSL证书的步骤如下:1. 购买SSL证书:选择一个可信赖的SSL证书提供商,并购买适合您需求的证书。通常,您需要提供一些个人和...
    99+
    2023-09-07
    ssl证书
  • Nginx使用自签ssl证书实现https连接的方法
    目录场景使用OpenSSL创建证书不同格式证书的转换Nginx下ssl配置方法验证方法场景 Nginx使用自签ssl证书实现https连接。 使用OpenSSL创建证书 建立服务器私...
    99+
    2024-04-02
  • Angular跨字段验证器中如何直接调用其它独立的验证器
    目录跨字段验证使用独立的验证器总结在angular中关于表单动态验证的一种新思路一文中我们给出了Angular项目进行字段校验的三种方法。本文我们将重点围绕第一种方法展开讨论。 假设...
    99+
    2024-04-02
  • vue表单验证rules及validator验证器如何使用
    这篇文章主要介绍“vue表单验证rules及validator验证器如何使用”,在日常操作中,相信很多人在vue表单验证rules及validator验证器如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-02
  • 如何使用Python实现极验验证码识别验证码
    这篇“如何使用Python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验...
    99+
    2023-07-05
  • ssl证书通配符如何使用
    通配符 SSL 证书通常用于为主域名和其相关的子域名提供加密保护。下面是使用通配符 SSL 证书的几个步骤:1. 生成证书签名请求(...
    99+
    2023-09-05
    ssl证书
  • 如何使用Ajax验证用户名
    这篇文章主要介绍了如何使用Ajax验证用户名,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用Ajax验证用户名代码如下所示:接口: get ...
    99+
    2024-04-02
  • Flex验证控件如何使用
    Flex验证控件如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.验证必填项代码如下:<mx:Validatoridmx:Validatorid="na...
    99+
    2023-06-17
  • django验证系统如何使用
    这篇文章主要介绍了django验证系统如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇django验证系统如何使用文章都会有所收获,下面我们一起来看看吧。user对象用户对象是认证系统的核心。django...
    99+
    2023-07-05
  • 如何使用weui.topTips验证数据
    这篇文章主要为大家展示了“如何使用weui.topTips验证数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用weui.topTips验证数据”这篇文...
    99+
    2024-04-02
  • Linux下如何使用sshpass绕过SSH密码验证
    这篇文章将为大家详细讲解有关Linux下如何使用sshpass绕过SSH密码验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ssh 直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass ...
    99+
    2023-06-27
  • 前端如何调用后台tp6验证码
    这篇文章主要为大家展示了“前端如何调用后台tp6验证码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“前端如何调用后台tp6验证码”这篇文章吧。环境前端:uni-app后端:thinkphp6在做...
    99+
    2023-06-22
  • jQuery如何使用正则验证15/18身份证
    小编给大家分享一下jQuery如何使用正则验证15/18身份证,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最好的jQuery正...
    99+
    2024-04-02
  • 如何使用 PHP 进行用户验证?
    用户验证在 php 中至关重要,可以通过多种方式实现,包括依靠会话、使用数据库或利用第三方库。借助会话方法,可以通过检查 $_session 变量是否存在来验证用户是否已登录。使用数据库...
    99+
    2024-04-19
    php 用户验证 mysql laravel 敏感数据
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作