美文网首页
Feign客户端发送HTTPS请求绕过认证

Feign客户端发送HTTPS请求绕过认证

作者: Teddy_b | 来源:发表于2020-01-22 14:40 被阅读0次

一、背景

一个Spring Boot项目,为了使用Harbor仓库,起初通过Spring RestTemplate完成了对Harbor仓库的HTTPS请求,后想改为使用Feign客户端的方式请求Harbor仓库。

二、配置过程

1、pom文件依赖添加
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-jackson</artifactId>
            <version>9.3.1</version>
        </dependency>

其中openfeign是必须的依赖,而feign-jackson依赖主要是为了配置Feign客户端的编码和解码以支持JSON字符串

2、创建Feign客户端

import feign.Headers;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;

@FeignClient(name="feignClient")
public interface FeignClient {

    @Headers({"Content-Type: application/json", "Authorization: {token}"})
    @RequestLine("GET /api/users?username={username}")
    List<Map<String, Object>> getUsers(URI baseUri,
                                       @Param("token") String token,
                                       @Param("username") String username);
}
3、在Service中调用Feign客户端完成对Harbor仓库的请求
import feign.Feign;
import feign.Target;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;

@Import(FeignClientsConfiguration.class)
@Service(value = "service")
public class ServiceImpl implements IService {
      private FeignClient feignClient;
      public ServiceImpl () {
            harborFeignClientV0 = Feign.builder().encoder(new JacksonEncoder())
                    .decoder(new JacksonDecoder()).target(Target.EmptyTarget.create(HarborFeignClientV0.class));
      }

     @Override
    public List<Map<String, Object>> getUsers(DTO dTO){
        String usersUrl = getBaseUrl(dTO);
        try {
            SslUtils.ignoreSsl();
            return harborFeignClientV0.getUsers(new URI(usersUrl), dTO.getToken(), dTO.getUsername());
        } catch (Exception e){
            log.error("调用Harbor API错误:", e.getMessage());
            throw new RuntimeException(e);
        }
    }
}

相比较于Feign客户端发送HTTP请求,这里只多了一行代码SslUtils.ignoreSsl();,通过这个工具类,所有的HTTPS请求将会绕过证书检查。

4、工具类SslUtils

参考:https://blog.csdn.net/qq_34836433/article/details/78539009

public class SslUtils {
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    static class miTM implements TrustManager,X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }
    }

    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception{
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

三、踩坑过程

1、绕开HTTPS认证的另一个方法

参考:https://blog.csdn.net/Chipslyc/article/details/98851831
通过自己配置Feign客户端的配置绕开HTTPS认证检查,添加依赖和Feign客户端配置之后行不通,首先在添加依赖的时候,导致了好几次项目跑不起来;其次都配置好之后发送HTTPS请求时还是报错PKIX path building failed

2、依赖依赖之后单元测试无法正常启动

参考:http://www.lzhpo.com/article/93

启动单元测试报错Command line is too long

相关文章

  • Feign客户端发送HTTPS请求绕过认证

    一、背景 一个Spring Boot项目,为了使用Harbor仓库,起初通过Spring RestTemplate...

  • HTTPS请求,返回错误码详解

    HTTPS的请求在发送时,要求客户端和服务端有预定好的认证的有效证书,其实就是客户端在发送请求到服务端端时,要有...

  • iOS https 相应配置

    1.通过绕过证书认证的方法进行请求 客户端要实现 https 验证 1.系统验证2.本地证书验证 NSURLCon...

  • 谈谈feign

    Feign的前世今生 Feign是什么? Feign的工作机制 处理注解 解析参数 构造http请求模板 发送请求...

  • 文件上传总结

    1,检测javascript类型的绕过(客户端) -通常post请求发送到web服务器,客户端javascript...

  • Java客户端发送双向TLS认证HTTPS请求

    给出一个java客户端代码例子,这个客户端程序向REST服务器发送HTTPS请求,客户端和服务器端实现TLS双向认...

  • ssl认证

    单向认证 1.服务端向ca认证机构申请证书,获得公私钥和证书;2.客户端向服务端发送请求;3.服务端向客户端发送证...

  • spring security使用篇 记住我功能原理以及实现

    1.原理解析 1.1 记住我基本原理 客户端发送请求认证 UsernamePasswordAuthenticati...

  • HTTPS链式编程(AF 3.0)

    1. HTTPS 证书认证(导入相关证书) 2. 发送请求 [[AFNetAPIClient sharedJson...

  • 网络安全(III) 之 HTTPS安全

    HTTPS 认证流程https 认证流程 1. 客户端发起HTTPS请求这个没什么好说的,就是用户在浏览器里输入一...

网友评论

      本文标题:Feign客户端发送HTTPS请求绕过认证

      本文链接:https://www.haomeiwen.com/subject/wqnuzctx.html