【问题标题】:I'm trying to create a GlobalFilter to validate an RSA token but it's giving an error我正在尝试创建一个 GlobalFilter 来验证 RSA 令牌,但它给出了一个错误
【发布时间】:2022-11-11 09:11:24
【问题描述】:

我正在尝试创建一个 GlobalFilter 来验证 RSA 令牌,但它给出了一个错误:

找不到能够从类型 [java.lang.String] 转换的转换器 键入 [java.security.interfaces.RSAPublicKey]

我的组件 LoggingGlobalPreFilter.java:

@Component
public class LoggingGlobalPreFilter implements GlobalFilter {

  final Logger logger = LoggerFactory.getLogger(LoggingGlobalPreFilter.class);
  private RsaKeyPropreties Rsakeys;

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      logger.info("Pre-Filter executed");
    
      String requestPath = exchange.getRequest().getPath().toString();
      logger.info("Request path = " + requestPath);
      
      HttpHeaders headers = exchange.getRequest().getHeaders();
      Set<String> headerNames = headers.keySet();

      headerNames.forEach((header) -> {
          if(header.equals("Authorization")){
            SignedJWT sign;
            try {
              
              String token = headers.get(header).toString();
              if (token == null) {
                token="";
              }
              
              sign = SignedJWT.parse(token);
              JWSVerifier verifier = new RSASSAVerifier(Rsakeys.publickey());
              logger.info(header + " " + sign.verify(verifier));

            } catch (ParseException | JOSEException e) {
                e.printStackTrace();
            }
            
          }
          
      });

      return chain.filter(exchange);
  }

 
}

我的应用程序类 RoutingApplication.java:

EnableConfigurationProperties(RsaKeyPropreties.class)
@EnableDiscoveryClient
@SpringBootApplication
public class RoutingApplication {

    public static void main(String[] args) {
        SpringApplication.run(RoutingApplication.class, args);
    }

}

我的 Rsa 类 RsaKeyPropreties.java:

@ConfigurationProperties(prefix = "rsa")
public record RsaKeyPropreties(RSAPublicKey publickey,RSAPrivateKey privatekey) {
    
}

我的应用程序属性:

rsa.publickey=classpath:routing/public.pem
rsa.privatekey=classpath:routing/private.pem

我的文件 rsa:

有谁知道解决此错误的方法?

【问题讨论】:

    标签: spring-boot rsa


    【解决方案1】:

    我无法通过 application.properties,所以我做了一些测试,并通过获取 plubic.em 的路径并打开文件并将其转换为 RSAPublicKey 来获得它。以下是解决方案:

    RsaKeyPropreties 类:

    package com.example.routing.config;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import org.apache.commons.lang.StringUtils;
    
    public class RsaKeyPropreties{
    
        private String charKey;
    
        public String getPublicKey(){
            return this.charKey;
        }
    
        public void readResourceFile() {
            Path path = Paths.get("src/main/resources/routing/public.pem");
            try {
                this.charKey = Files.readAllLines(path).toString();
                this.charKey = StringUtils.removeEnd(this.charKey , ", -----END PUBLIC KEY-----]")
                .replace("[-----BEGIN PUBLIC KEY-----, ","").replace(", ","");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         }
        
    }
    

    LoggingGlobalPreFilter 类:

    package com.example.routing.components;
    import java.util.Base64;
    import java.util.Set;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.http.HttpHeaders;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.PublicKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.X509EncodedKeySpec;
    import java.text.ParseException;
    import com.example.routing.config.RsaKeyPropreties;
    import com.nimbusds.jose.JOSEException;
    import com.nimbusds.jose.JWSVerifier;
    import com.nimbusds.jose.crypto.RSASSAVerifier;
    import com.nimbusds.jwt.SignedJWT;
    import reactor.core.publisher.Mono;
    
    @Component
    public class LoggingGlobalPreFilter implements GlobalFilter {
    
      final Logger logger = LoggerFactory.getLogger(LoggingGlobalPreFilter.class);
      
      private RsaKeyPropreties Rsakeys = new RsaKeyPropreties();
    
      @Override
      public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
          logger.info("Pre-Filter executed");
        
          String requestPath = exchange.getRequest().getPath().toString();
          logger.info("Request path = " + requestPath);
          
          HttpHeaders headers = exchange.getRequest().getHeaders();
          Set<String> headerNames = headers.keySet();
    
          headerNames.forEach((header) -> {
              if(header.equals("Authorization")){
                String token = StringUtils.removeEnd(headers.get(header).toString(), "]")
                .replace("[Bearer ","");
    
                SignedJWT sign;
                Rsakeys.readResourceFile();
    
                try {
                  if (token == null) {
                    token="";
                  }
    
                  sign = SignedJWT.parse(token);
                  byte[] publicBytes = Base64.getDecoder().decode(Rsakeys.getPublicKey());
                  X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
                  KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                  PublicKey publickey = keyFactory.generatePublic(keySpec);
                 
    
                  JWSVerifier verifier = new RSASSAVerifier((RSAPublicKey) publickey);
    
                  if(sign.verify(verifier)){
                    logger.info("Valido");
                  }else{
                    logger.info("invalido");
                  }
                  
    
                } catch (ParseException | JOSEException | NoSuchAlgorithmException | InvalidKeySpecException e) {
                    e.printStackTrace();
                }
                
              }
              
          });
    
          return chain.filter(exchange);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多