FeignClient发送https请求时的证书验证原理分析

背景

微服务之间存在调用关系,且部署为 SSL 协议时,Feignt 请求报异常:

bash 复制代码
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这个异常是怎么产生的,解决办法是什么呢?利用 DeepSeek 回忆一下这个问题。输入问题:

FeignClient发送 https 请求时的 SSL 验证原理是什么呢

FeignClient在发送HTTPS请求时,其SSL验证原理主要涉及SSL/TLS协议的握手过程、证书验证机制以及如何处理自定义的SSL配置,以下是详细的原理说明。

1. SSL/TLS握手过程

当FeignClient发起HTTPS请求时,首先会与目标服务器进行SSL/TLS握手。握手过程包括以下几个步骤:

  • 客户端发送支持的加密套件和压缩方法:客户端向服务器发送它支持的加密算法(如TLSv1.2)和压缩方法。
  • 服务器响应并选择加密套件:服务器选择一个加密套件并发送自己的数字证书。
  • 证书验证:客户端验证服务器的证书是否由受信任的证书颁发机构(CA)签发。如果证书有效,则继续握手。
  • 生成共享密钥:客户端生成一个随机数(premaster secret),并使用服务器的公钥加密后发送给服务器。
  • 服务器解密并生成会话密钥:服务器使用自己的私钥解密premaster secret,并生成会话密钥,用于后续的加密通信。
  • 加密通信:客户端和服务器使用会话密钥对数据进行加密和解密,确保数据传输的安全性。

2. 证书验证机制

在SSL/TLS握手过程中,证书验证是确保通信双方身份真实性的关键步骤。FeignClient在发送HTTPS请求时,会根据配置的SSL上下文(SSLContext)和信任管理器(X509TrustManager)来验证服务器的证书。

  • 默认验证:如果未配置自定义的SSL上下文,FeignClient会使用系统默认的SSL上下文,该上下文信任由Java自带的CA签发的证书。如果目标服务器的证书是自签名的或由不受信任的CA签发的,验证会失败,导致连接中断。
  • 自定义验证 :通过配置自定义的SSL上下文和信任管理器,可以指定信任的证书或忽略证书验证。例如,使用X509TrustManager信任所有证书,或者通过NoopHostnameVerifier忽略主机名验证。

3. FeignClient的SSL配置

在Spring Cloud项目中,FeignClient的SSL配置通常通过以下方式实现:

  • 使用@FeignClient注解:在Feign客户端接口中指定URL为HTTPS地址,例如:
java 复制代码
  @FeignClient(name = "cloud-paltform", url = "https://xxx:9999")
  • 配置SSL上下文 :通过自定义的Client配置类,设置SSL上下文和信任管理器。例如:
java 复制代码
  @Configuration
  public class FeignHttpsConfig {
      @Bean
      public Client feignClient() {
          return new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());
      }

      private SSLSocketFactory getSSLSocketFactory() throws Exception {
          SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
          X509TrustManager tm = new X509TrustManager() {
              @Override
              public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                  // 忽略客户端证书验证
              }

              @Override
              public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                  // 忽略服务器证书验证
              }

              @Override
              public X509Certificate[] getAcceptedIssuers() {
                  return new X509Certificate[0];
              }
          };
          sslContext.init(null, new TrustManager[]{tm}, new SecureRandom());
          return sslContext.getSocketFactory();
      }
  }

通过上述配置,FeignClient在发送HTTPS请求时会忽略SSL证书验证,从而绕过证书信任问题。

  • Spring Boot配置 :在application.yml或application.properties中配置SSL相关参数,例如:
yaml 复制代码
  feign:
    httpclient:
      disable-ssl-validation: true

4. 绕过SSL验证的注意事项

虽然绕过SSL验证可以解决证书信任问题,但需要注意以下几点:

  • 安全性风险:忽略SSL验证会导致中间人攻击(MITM)的风险,攻击者可以拦截和修改通信内容,因此仅在测试环境中使用。
  • 证书管理:如果使用自签名证书,需要将其添加到信任库中,否则客户端无法验证证书的有效性。
  • 依赖管理 :确保项目中引入了正确的依赖,例如feign-httpclient,以便使用HttpClient的SSL配置。

5. 总结

FeignClient在发送HTTPS请求时,通过SSL/TLS协议进行加密通信,并通过证书验证确保服务器身份的真实性。

默认情况下,FeignClient会使用系统默认的SSL上下文,但可以通过自定义配置绕过SSL验证。

在实际应用中,建议使用受信任的CA签发的证书,并正确配置SSL上下文以确保通信的安全性。

解决办法:

  1. 通过配置 feign.httpclient.disable-ssl-validation: true 禁用 SSL 校验 。测试了,不生效。需要跟源码看看具体生效配置是什么。
  2. 基于 spring-cloud-loadbalancer 的 Feign 客户端配置禁用 SSL 校验

结论:最好还是应该通过配置来控制,方法二需要添加一个条件。

相关推荐
weixin_307779137 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
code_slave(码畜)10 小时前
微服务架构落地:基础服务 —— 报表服务(中篇:元数据、查询引擎、缓存与权限落地)
spring boot·spring cloud·缓存·微服务·架构
豆豆10 小时前
2026 年建站架构选型实录:从 SC-081v3 证书新政与备案新规倒推 CMS 选型口径
架构·https·cms·geo·acme·web架构·pageadmin
海宇大数据11 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化远程公证会话初始化网关
运维·人工智能·架构·自动化
邵奈一11 小时前
Codex 重连卡半天,一行配置搞定
架构
code_slave(码畜)11 小时前
微服务架构落地:基础服务 —— 报表服务(AI 集成篇:AI 增强报表能力)
人工智能·spring boot·spring cloud·微服务·架构
天远数科12 小时前
零信任架构实战:基于天远全能消金报告构建自动化消费分期网关
运维·人工智能·架构·自动化
code_slave(码畜)12 小时前
微服务架构落地:公共中间件层总览——不承载业务,只承载稳定性
spring boot·spring cloud·微服务·中间件·架构
Lsetea17 小时前
OpenSSL verify报invalid CA certificate:basicConstraints与keyCertSign排查
运维·https·ssl证书·openssl·证书链
weixin_4045512417 小时前
AI Native 架构建议:从零开始以 AI 为核心构建系统
人工智能·架构