feignClient 支持ssl的两种写法

本文介绍如何在Feign中配置HTTPS接口调用。通过使用okhttp客户端实现证书验证绕过,并提供httpclient配置示例。
最近在开发项目过程中,使用feign调用https 域名的接口方法。之前在使用httpclient okhttp 这种客户端的时候就比较简单。还没研究过feign的这个该怎么配置。于是翻了下源码,发现如果使用okhttp这个客户端,代码比较简洁。
@Bean
        public Feign okHttpClient(){
            okhttp3.OkHttpClient.Builder builder = new okhttp3.OkHttpClient.Builder();
            OkHttpClient build = new DefaultOkHttpClientFactory(builder).createBuilder(true).build();
            return Feign.builder().client(new feign.okhttp.OkHttpClient(build)).build();
        }
因为DefaultOkHttpClientFactory中已经为我们实现了绕过证书验证的方法,如图

在这里插入图片描述
如果你使用的是httpclient客户端的话,可以像下面这么写

@Bean
       public Client skipSSLClient() {
           try {
               return Optional.of(
                       new SSLContextBuilder()
                               .loadTrustMaterial(null, (chain, authType) -> true)
                               .build()
               ).map(s ->
                       new Client.Default(
                               s.getSocketFactory(),
                               new NoopHostnameVerifier())
               ).get();
           } catch (Exception e) {
               return new Client.Default(null, null);
           }
       }

OK 到此结束。

### 配置 FeignClient 以忽略 SSL 证书验证 为了使 `FeignClient` 忽略 SSL 证书验证,在应用程序中可以通过自定义 HTTP 客户端来实现这一点。具体来说,可以使用 OkHttp 来构建一个不验证 SSL 的客户端实例。 #### 自定义 OkHttpClient 实现 创建一个新的类用于配置 OkHttpClient: ```java import feign.okhttp.OkHttpClient; import okhttp3.ConnectionSpec; import okhttp3.OkHttpClient; import javax.net.ssl.*; import java.security.cert.X509Certificate; public class UnsafeOkHttpClient { public static OkHttpClient getUnsafeOkHttpClient() { try { final TrustManager[] trustAllCerts = new TrustManager[]{ 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[]{}; } } }; final SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions() .cipherSuites() .build(); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectionSpecs(Collections.singletonList(spec)) .sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build(); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } } } ``` 此代码片段展示了如何设置一个信任所有服务器证书并接受任何主机名的 OkHttpClient 实例[^3]。 #### 将自定义 OkHttpClient 应用到 Feign Client 中 为了让上述配置生效,还需要告诉 Spring 使用这个定制化的 OkHttpClient。这通常是在启动类或配置文件里完成的: ```yaml spring: cloud: openfeign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: full requestInterceptors: - com.example.UnsafeOkHttpClient#getUnsafeOkHttpClient ``` 注意这里假设 `com.example.UnsafeOkHttpClient` 是前面提到的那个 Java 类的位置;如果位置不同,则需相应调整包路径[^2]。 另外需要注意的是,虽然这种方法可以在开发环境中快速解决问题,但在生产环境部署前应谨慎考虑安全性影响,并尽可能修复根本原因而不是简单地禁用 SSL 验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值