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

 更新时间:2025年07月15日 09:34:51   作者:秋分的秋刀鱼  
Feign默认验证SSL证书,若服务器使用自签名或内部CA证书会导致连接失败,解决方法是跳过校验,但仅限测试环境,生产环境需严格验证以确保安全

一、问题抛出

如果不配置跳过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证书校验的配置,但应谨慎使用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中获取profile的方法详解

    SpringBoot中获取profile的方法详解

    这篇文章主要介绍了springboot获取profile的操作,文中的示例代码讲解详细,具有很好的参考价值,希望对大家有所帮助
    2022-04-04
  • java去除集合中重复元素示例分享 java去除重复

    java去除集合中重复元素示例分享 java去除重复

    这篇文章主要介绍了java去除集合中重复元素示例,大家参考使用吧
    2014-01-01
  • Javaweb中使用Jdom解析xml的方法

    Javaweb中使用Jdom解析xml的方法

    Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.这篇文章主要介绍了Javaweb中使用Jdom解析xml的方法的相关资料,需要的朋友可以参考下
    2016-09-09
  • 浅谈Java锁的膨胀过程以及一致性哈希对锁膨胀的影响

    浅谈Java锁的膨胀过程以及一致性哈希对锁膨胀的影响

    本文主要介绍了Java锁的膨胀过程以及一致性哈希对锁膨胀的影响,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java的Spring框架中bean的继承与内部bean的注入

    Java的Spring框架中bean的继承与内部bean的注入

    这篇文章主要介绍了Java的Spring框架中bean的继承与内部bean的注入,Spring框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Java 9中如何对IntegerCache进行修改详解

    Java 9中如何对IntegerCache进行修改详解

    这篇文章主要给大家介绍了关于Java 9中如何对IntegerCache进行修改的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用java9具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-12-12
  • MyBatis中常用的SQL语句详解

    MyBatis中常用的SQL语句详解

    MyBatis是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,本文介绍了MyBatis中常用的SQL语句,包括基本查询、多条件查询、关联查询、分页查询、插入、更新、删除等,并结合MyBatis的特性进行了说明
    2025-03-03
  • IDEA启动Springboot报错:无效的目标发行版:17 的解决办法

    IDEA启动Springboot报错:无效的目标发行版:17 的解决办法

    这篇文章主要给大家介绍了IDEA启动Springboot报错:无效的目标发行版:17 的解决办法,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • 基于ReentrantLock的实现原理讲解

    基于ReentrantLock的实现原理讲解

    这篇文章主要介绍了ReentrantLock的实现原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java双重MD5加密实现安全登录

    Java双重MD5加密实现安全登录

    MD5对密码进行加密存储是常见的一种加密方式,本文主要介绍了Java双重MD5加密实现安全登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论