千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关如何使用RestTemplate调用https接口跳过证书验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。RestTemplate调用
千家信息网最后更新 2026年11月03日如何使用RestTemplate调用https接口跳过证书验证

这篇文章将为大家详细讲解有关如何使用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 {     /**     * 跳过证书效验的sslcontext     *      * @return     * @throws Exception     */    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;    }     /**     * 构造RestTemplate     *      * @return     * @throws Exception     */    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认证的问题:

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

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

2.下载证书,将证书导入到JDK的证书管理里面。

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

添加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 registry = RegistryBuilder.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> converters = restTemplate.getMessageConverters();            ArrayList> 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工作原理流程图如下:

那么,什么是SSL证书?

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

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

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

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

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

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

证书 验证 文件 问题 接口 认证 服务器 项目 服务 上边 域名 篇文章 原因 原理 就是 方法 更多 流程 目录 自然 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 百单网互联网科技有限公司 喔噻互联网科技有限公司 互联网科技图片 互联网科技活动banner 互联网科技排名 善班互联网科技有限公司 奇士达互联网科技 互联网科技缩写 互联网公司会议桌创意科技软装饰 互联网金融中的现代科技 河南猎农互联网科技有限公司 注册互联网科技公司经营范围大全 广西互联网科技孵化中心 想开互联网科技公司怎么样 西安小鹰速贷互联网科技有限公司 烟台灵鸽互联网科技有限公司 互联网科技收购价值 互联网时代高科技布局 玉溪新华互联网科技怎么选 互联网金融科技 什么是科技互联网 今日互联网科技 互联网核心科技是什么 恒生科技互联网指数分析 山东星卡互联网科技有限公司官网 皮皮虾互联网科技有限公司 长沙易易互联网科技有限公司 河南商务圈互联网科技有限公司 颐高云石互联网科技
0