likes
comments
collection
share

微服务网关API加解密组件gateway-api-encrypt

作者站长头像
站长
· 阅读数 66

一、概述

gateway-api-encrypt是一款基于spring-cloud-gateway的接口加解密starter,通过SpringBoot的简单配置就能够实现各种业务场景下的接口参数校验和加解密。其中包含时间戳校验、签名校验、对称加密非对称加密等多种功能,也能够根据白名单、黑名单配置过滤接口地址。

二、快速开始

1、引入依赖

<dependency>
    <groupId>cn.futuai.open</groupId>
    <artifactId>gateway-api-encrypt-starter</artifactId>
    <version>1.0.0</version>
</dependency>

2、配置参数

spring:
  cloud:
    gateway:
      api-encrypt:
        # 全局开关
        enabled: true
        # 加密对称密钥http header key
        encrypt-aes-key-header-key: "ek"
        # 时间戳http header key
        timestamp-header-key: "ek"
        # 签名值http header key
        sign-header-key: "sign"
        # 加密query参数key
        encrypt-param-key: "ciphertext"
        # rsa非对称加密私钥
        rsa-private-key: "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI6VKvsus/Z0R3zvqre3gzClHJdsCVeKq89hZFFWbg5l3FNbiGZEEiuD1LL+USi5GCxeRK+xEOFTj7I/waRVb3x7V3J1N0q4nNWoZvRey0MTVaBkoHeB5tzn2ZOCBQRJnijXcO58ChcLXOTQId+zDiCBCom/A62gtH8isH4PYoZXAgMBAAECgYBpetrwNa223nDgcWFHRkCMZSmQr8D9fT37Th5rudfzWNG07RssJKGYhY9913xs9vl2IUsI+qH1P98nS9lSXE37mfOKFhfGZIUjAhMb7/w8hhuHpBXopVpUJZW0B46gfPOsrmvq+xiwlI02UYJ1ZOrfdfbvss/Gwtgrk4pMigL1OQJBANRm4mOUMwF+xUxeOLa2Aafke/iwdcxoV1k1gXmTH0B8wf08zDR7heW737YBEvsjyfEpjo7Y0kGSE5zmTWNnuKUCQQCr2XuZeJLqq6etq7IhboPAx8E2xgfOY/hgKPr9IvM8gYee628YhyOynIhOVFGxaf7dMH9eZ1P6jAbvsgm+mFZLAkEAyY0btJyTzg5q0G30aUTKy3OgRDvGfIJiqM+CHkiCdmIsfs5rhD3WsEqYHZBlX5T1cvgZQ+nxkrE4FUHhG7v31QJAYJZ9TNYjJTjTpt5A4V9/OAROCZ4mVw+DU3DVGR/ivJhFBMJpD80s+D/YsMXdoKzlraaLgCDtZ336jBByP6jZnwJBAIGUnbs7eRLcXzlbORdKC/EfkDYS2rrXLFvQhehT7Y8dKHLZfJElnrHB33Qd8R8WP0PsPU6D7EWNU2zVNK1EDxY="
        # 检测模式
        check-model:
          # 模式
          model: black_list
          # 黑名单URL列表
          black-list:
            - /api/user/code
            - /api/user/code2
        timestamp:
          # 时间戳校验开关
          enable: true
          # 时间戳有效秒数
          timestamp-valid-second: 604800
        sign:
          # 签名校验开关
          enable: true
        # 请求解密配置
        request-decrypt:
          # 检测模式
          check-model:
            # 白名单模式
            model: white_list
            # 白名单URL列表
            white-list:
              - /api/user/code2
        # 响应加密配置
        response-encrypt:
          # 检测模式
          check-model:
            # 黑名单模式
            model: black_list
            # 黑名单URL列表
            black-list:
              - /api/user/code

3、自定义API异常回调管理器

@Configuration
public class ApiEncryptConfiguration {

    public ApiEncryptConfiguration() {
        // 网关回调管理器
        GatewayApiInvalidCallbackManager.setApiInvalidHandler(new ApiValidExceptionRequestHandler() {
            /**
             * 网关API校验失败,就会调用此回调
             * @param serverWebExchange serverWebExchange
             * @param throwable 异常
             * @return mono
             */
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange,
                    Throwable throwable) {
                Response<Void> error = Response.create(ResponseTypeEnum.PARAM_VALID_ERROR);
                String errJson = JacksonMapper.toJsonString(error);
                return ServerResponse.ok().body(Mono.just(errJson), String.class);
            }
        });
    }
}

三、案例

1、配置网关服务和用户服务

网关服务:

  • 引入gateway-api-encrypt-starter和nacos依赖
  • 参考“快速开始”配置API加解密规则

用户服务

  • 引入nacos等依赖
  • 定义API接口
    @PostMapping("{path}")
    public Map<String, Object> code(@PathVariable("path") String path, @RequestParam String test1,
            @RequestParam String test2,
            @RequestParam String test3,
            @RequestBody String body) {
        Map<String, Object> map = new HashMap<>();
        map.put("path", path);
        map.put("test1", test1);
        map.put("test2", test2);
        map.put("test3", test3);
        map.put("body", body);
        log.info(String.valueOf(map));
        return map;
    }

2、发起请求

请求参数加密,响应结果加密,校验时间戳、签名

微服务网关API加解密组件gateway-api-encrypt

请求参数不加密,响应结果不加密,校验时间戳、签名

微服务网关API加解密组件gateway-api-encrypt

请求参数加密,响应结果不加密,校验时间戳、签名

微服务网关API加解密组件gateway-api-encrypt

请求参数不加密,响应结果加密,校验时间戳、签名

微服务网关API加解密组件gateway-api-encrypt

跳过所有检测

微服务网关API加解密组件gateway-api-encrypt

错误请求

微服务网关API加解密组件gateway-api-encrypt

四、原理解析

五、源码

gateway-api-encrypt-starter

转载自:https://juejin.cn/post/7380296247721558051
评论
请登录