当前位置: 首页 > article >正文

feign调用跳过HTTPS的SSL证书校验配置详解

一、问题抛出

如果不配置跳过SSL证书校验,当Feign客户端尝试连接到一个使用自签名证书的服务器时,可能会抛出类似以下的异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

二、原因分析

如果不添加跳过SSL证书校验的配置,Feign客户端在调用HTTPS服务时会严格验证服务器的SSL证书。这种行为是默认且推荐的做法,因为它可以确保通信的安全性和完整性。以下是如果不添加该配置的具体影响:

2.1 证书验证

默认行为:Feign客户端会使用系统的默认TrustManager来验证服务器的SSL证书。
验证内容:
证书有效性:检查证书是否由受信任的证书颁发机构(CA)签发。
证书过期:确保证书在有效期内。
证书链:验证证书链的完整性。
主机名匹配:确保证书中的主机名与请求的主机名匹配。
目的:验证服务器的身份,确保客户端连接的是正确的服务器。
过程:
客户端请求服务器的证书。
服务器返回证书。
客户端验证证书的有效性,包括证书是否由受信任的CA签发、证书是否过期等。
如果验证通过,客户端和服务器使用证书中的公钥进行密钥交换,建立安全的通信通道。

2.2 影响

安全性增强:确保数据传输的安全性和完整性,防止中间人攻击。
潜在问题:
自签名证书:如果服务器使用自签名证书或内部CA签发的证书,客户端会拒绝连接,除非这些证书被显式信任。
证书过期或无效:如果证书过期或无效,客户端会拒绝连接。
主机名不匹配:如果证书中的主机名与请求的主机名不匹配,客户端会拒绝连接。

三、解决方法-跳过SSL证书校验

风险:跳过SSL证书校验会使得中间人攻击成为可能,攻击者可以拦截并篡改数据。
适用场景:仅在开发和测试环境中使用,生产环境中应严格配置和验证SSL证书。
实现方法:
创建一个自定义的TrustManager,忽略证书校验。
配置自定义的SSLSocketFactoryHostnameVerifier

四、代码配置,跳过SSL证书校验

@Slf4j
@Configuration
public class FeignClientConfig {

    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public CachingSpringLoadBalancerFactory cachingFactory(SpringClientFactory clientFactory) {
        return new CachingSpringLoadBalancerFactory(clientFactory);
    }

    @Bean
    @ConditionalOnMissingBean
    public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
                              SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext ctx = SSLContext.getInstance("SSL");
        X509TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(),
                HttpsURLConnection.getDefaultHostnameVerifier()),
                cachingFactory, clientFactory);
    }
}

五、总结

不添加跳过SSL证书校验的配置可以显著提高安全性,但可能会导致连接失败,特别是在使用自签名证书或内部CA证书的情况下。因此,建议在生产环境中正确配置和验证SSL证书,而在开发和测试环境中可以考虑使用跳过SSL证书校验的配置,但应谨慎使用。


http://www.kler.cn/a/512946.html

相关文章:

  • leetcode 面试经典 150 题:插入区间
  • 开源AI崛起:新模型逼近商业巨头
  • 三格电子——MODBUS TCP 转 CANOpen 协议网关
  • mac m1下载maven安装并配置环境变量
  • Deformable Detr回顾
  • 深入浅出:Go语言os包中的API使用指南
  • Android 右键后无Java class创建
  • 2024:在成长、创作与生活中找到星光
  • SSM宠物医院信息管理系统
  • C# 的 NLog 库高级进阶
  • PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统
  • TaskBuilder前后端通讯的数据格式
  • 扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践
  • 持续集成工具Jenkins(一)
  • 服务器机房迁移,centos系统root无法登录,也无法联网等问题
  • Pandas 数据分析(二)【股票数据】
  • Windows7搭建Hadoop-2.7.3源码阅读环境问题解决列表
  • Maven私服-Nexus3安装与使用
  • Android SystemUI——自定义状态栏和导航栏(十二)
  • 特朗普:加密货币列为国家优先事项
  • Visual Studio 2022中文软件下载安装过程
  • DNS DDoS攻击是怎么回事?怎么预防?
  • 【网络原理】万字详解 HTTP 协议
  • 【Python运维】用Python管理Docker容器:从`docker-py`到自动化部署的全面指南
  • WGAN - 瓦萨斯坦生成对抗网络
  • Video-RAG:一种将视频RAG新框架