惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
S
SegmentFault 最新的问题
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
DataBreaches.Net
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
宝玉的分享
宝玉的分享
腾讯CDC
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
T
The Exploit Database - CXSecurity.com
T
The Blog of Author Tim Ferriss
V
V2EX
S
Securelist
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Y
Y Combinator Blog
P
Proofpoint News Feed
T
Tor Project blog
AWS News Blog
AWS News Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
博客园 - 聂微东
T
Threat Research - Cisco Blogs
B
Blog
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
N
News and Events Feed by Topic
博客园 - 司徒正美
H
Help Net Security
C
Cisco Blogs
C
Check Point Blog
S
Secure Thoughts

博客园 - 一叶知秋。

从包含时间属性的对象列表中,筛选出时间≤指定时间参数且最接近该时间参数的那个对象 安装nginx和OpenSSL struts2的<s:if test>标签的注意点 mysql怎么写逻辑比较清晰? 设置idea 代码报错时不弹框显示 Collections.sort多个字段排序 LigerUI 中的 Grid (ligerGrid) 合并单元格 mysql模糊查找数据库使用的字段名 关于easyExcel解析未添加@ExcelProperty报错问题分析 Nginx的常用命令(启动重启停止等) 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException报错 msyql查询表的索引sql语句 MySQL查看表占用空间大小 js屏蔽回车提交 kettle同步表数据null处理 MySql 分组后获取距离时间最近的第一条数据 mysql解表和查看锁表 Windows关闭指定端口命令 Windows 技术篇-防火墙启用时指定外部可访问端口,防火墙开放端口设置
spring RestTemplate忽略证书验证
一叶知秋。 · 2024-08-08 · via 博客园 - 一叶知秋。

要使RestTemplate忽略SSL证书验证,你可以配置一个自定义的SSLContext,然后将其注入到RestTemplate使用的HttpClient中。以下是一个示例代码:

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.springframework.http.MediaType;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

public class RestTemplateConfig {

    /**
     * 我们创建了一个SSLContext,它会接受所有的SSL证书,而不进行验证。
     * 然后我们创建了一个SSLConnectionSocketFactory,它使用这个SSLContext,并且提供了一个NoopHostnameVerifier,
     * 这个Verifier不会进行主机名验证。
     * 最后,我们创建了一个配置了这个SSLConnectionSocketFactory的HttpClient,并将其设置为RestTemplate工厂的HttpClient。
     * @return RestTemplate
     */
    public static RestTemplate createRestTemplate() {
        try {

            //SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build();
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                    return true;
                }
            }).build();
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
            HttpClient httpClient = HttpClients.custom()
                    .setSSLSocketFactory(socketFactory)
                    .build();

            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
            factory.setHttpClient(httpClient);

            RestTemplate restTemplate=new RestTemplate(factory);

            FastJsonHttpMessageConverter converter=mediaType();
            restTemplate.getMessageConverters().add(converter);
            return restTemplate;
        //} catch (KeyManagementException | NoSuchAlgorithmException e) {
        } catch (Exception e) {
            throw new RuntimeException("Failed to create RestTemplate", e);
        }
    }

    private static FastJsonHttpMessageConverter mediaType(){
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);
        converter.setSupportedMediaTypes(supportedMediaTypes);
        return converter;
    }

}

在这个示例中,我们创建了一个SSLContext,它会接受所有的SSL证书,而不进行验证。然后我们创建了一个SSLConnectionSocketFactory,它使用这个SSLContext,并且提供了一个NoopHostnameVerifier,这个Verifier不会进行主机名验证。最后,我们创建了一个配置了这个SSLConnectionSocketFactoryHttpClient,并将其设置为RestTemplate工厂的HttpClient

请注意,忽略SSL证书验证会降低安全性,因此应该只在你完全理解潜在的安全风险的情况下使用,通常这种做法只适用于开发或测试环境。