可以将java与jwt、rs256和auth0一起使用吗?

可以将java与jwt、rs256和auth0一起使用吗?,java,spring-boot,jwt,Java,Spring Boot,Jwt,这是我在尝试验证jwt令牌时遇到的异常: RSA公钥仅支持RSAPublicKeySpec和X509EncodedKeySpec 我正在使用com.nimbusds.jose 以下是doFilter方法: @Override public void doFilter(final ServletRequest req, final ServletResponse res, final

这是我在尝试验证jwt令牌时遇到的异常: RSA公钥仅支持RSAPublicKeySpec和X509EncodedKeySpec

我正在使用com.nimbusds.jose

以下是doFilter方法:

    @Override
    public void doFilter(final ServletRequest req,
                         final ServletResponse res,
                         final FilterChain chain) throws IOException, ServletException {


        final HttpServletRequest request = (HttpServletRequest) req;
        if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
            chain.doFilter(req, res);
        } else {

            String workingDir = System.getProperty("user.dir");
            System.out.println("Current working directory : " + workingDir);

            final String authHeader = request.getHeader("Authorization");
            if (authHeader == null || !authHeader.startsWith("Bearer ")) {
                throw new ServletException("Missing or invalid Authorization header.");
            }

            final String token = authHeader.substring(7); // The part after "Bearer "
            try {
                JWSObject jwsObject = JWSObject.parse(token);
                JWSVerifier verifier = new RSASSAVerifier(getPublicKey("szabo.cer"));
                jwsObject.verify(verifier);
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (GeneralSecurityException e) {
                e.printStackTrace();
            } catch (JOSEException e) {
                e.printStackTrace();
            }
            chain.doFilter(req, res);
        }

    }
以下是完整的类代码:

以下是堆栈跟踪:

2017-07-21 09:18:39.804  INFO 8852 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-07-21 09:18:39.805  INFO 8852 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-07-21 09:18:39.822  INFO 8852 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 17 ms
Current working directory : E:\AdrianEmberTests\szabo
java.security.spec.InvalidKeySpecException: Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys
    at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:306)
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
    at com.associations.security.JwtFilter.getPublicKeyFromString(JwtFilter.java:51)
    at com.associations.security.JwtFilter.getPublicKey(JwtFilter.java:42)
    at com.associations.security.JwtFilter.doFilter(JwtFilter.java:77)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

您正在使用PKCS8EncodedKeySpec构建公钥,该PKCS8EncodedKeySpec设计用于封装私钥

 RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new PKCS8EncodedKeySpec(encoded));
用这个

RSAPublicKey pubKey = (RSAPublicKey)
     KeyFactory.getInstance("RSA")
           .generatePublic(new X509EncodedKeySpec(bytes));

你的代码不在那里。发布getPublicKey的代码和完整的.stack跟踪。不要发布代码或跟踪作为答案。只需编辑你自己的帖子。我是为你做的,请在尝试问更多问题之前阅读。嗨,在使用你的代码后,我得到了:java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:DerInputStream.getLength:lengthTag=111,太大了。位于sun.security.rsa.RSAKeyFactory.EngineeGeneratePublicsMakeyFactory.java:205,但它有助于更好地理解问题。所以我发现现在它似乎很好用。您的RSA密钥是否以有效的PEM格式编码?X509EncodedKeySpec需要包含算法和密钥内容的ASN.1结构的DER编码,似乎不正确。您链接的示例是从Json web密钥格式JWKOn Auth0读取的,如果您转到客户端->设置->高级设置->证书,它们会为您提供下载证书的链接,您可以选择pem、cer或PKCS7。还有更多我说不出来的。我使用expressjs,它提供了一个简单的模块,知道如何正确读取pem文件。我在spring boot中为此花了很多时间,但他们似乎不喜欢auth0。无论如何,我找到的解决方案似乎完全符合我的要求,但它请求auth0获取该公钥。
RSAPublicKey pubKey = (RSAPublicKey)
     KeyFactory.getInstance("RSA")
           .generatePublic(new X509EncodedKeySpec(bytes));