2017-10-31 5 views
0

나는 공개 키에 인증서를 변환 코드 아래 사용 JwtConsumer에 전달하십시오 PublicKey의 인스턴스를 생성하는 동안 .cer 파일을 사용하여 JWT RS256 토큰을 디코딩하는 방법 제공?

jwt = "eU13VUDPQsLv2fvbCPEyeuQubditVOguIa2UWvaMhx2ES7cMlTL8F6IgplgpG_H7bXpduPnFUncn7zUYRXmvw_Bts8EfqICeGa5db6RGmofeA01OqowgCfxhWLwmU786riJIT0twMFe...............................BzR7DOvqsahbsx93yKqB_5Q"; 
      // read public key from a file or config or something 
      String publicKeyPEM = 
        "-----BEGIN CERTIFICATE-----\n" + 
          "MIIFuDCCBKCgAwIBAgIQXQ/D2sE/XdZYvdViF83mMzANBgkqhkiG9w0BAQsFADB+\n" + 
.........................................................................................................              "saQRa7TBj6gAdlYwJVR+4hpLngANpwAG+bXHuEs+Ns/dE/s+b7aUb8/IJTWNtaaQ\n" + 
          "lMvr/4xtT6ZNCiaIM3uvIvzHqPxCn3sWa94FP9FIg3mbIia1ZbUx8NyMpETOjxaO\n" + 
          "X242VTjKf7mLCqibyn3kj93zZjgNa0AlbF/QdE9z4tQ58BwoDVlNK4mGv7Uq2nca\n" + 
          "2qTrgWcVVKyhKMnytiQ4LTs5O45R/YNbnEH7CA==\n" + 
          "-----END CERTIFICATE-----"; 


      RsaKeyUtil rsaKeyUtil = new RsaKeyUtil(); 
      PublicKey publicKey = rsaKeyUtil.fromPemEncoded(publicKeyPEM); 

      // create a JWT consumer 
      JwtConsumer jwtConsumer = new JwtConsumerBuilder() 
        .setRequireExpirationTime() 
        .setVerificationKey(publicKey) 
        .build(); 

      // validate and decode the jwt 
      JwtClaims jwtDecoded = jwtConsumer.processToClaims(jwt); 

그러나 나는 아래의 오류가 발생합니다.

Starting Applicationjava.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96) 

어떤 이유 일 수 있습니까? enter image description here JWT.IO가 서명이 유효 함을 보여줍니다.

인증서는 .cer 형식으로되어 있습니다. 만약 내가 올바르게 기억

답변

3

-----BEGIN CERTIFICATE-----은 공개 키가 아니라 인증서가 있다는 것을 의미합니다. 인증서는 공개 키

나는 2 가지 이상 제거하려
InputStream is = new   ByteArrayInputStream(pemString.getBytes("UTF-8)); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
Certificate cert = cf.generateCertificate(is); 
PublicKey publicKey= cert.getPublicKey(); 
+0

고마워요! 올바른 방법을 보여주기 위해 :)! –

0

당신이 가지고 :

  • -----BEGIN CERTIFICATE-----를 제거하고 -----END CERTIFICATE-----
  • 이 제거 모든 \n이 내가 JCE API를 사용하여 인증서를 읽을해야 할 일을했을 것입니다

발생 .

+0

을 포함하지만 아래의 오류 얻을 : 문자열 색인이 범위를 벗어을 : -26 –

+0

의 CertificateFactory 읽을 수 있습니다 PEM은 DER을 _or_. 불필요한 경우에도 PEM을 DER로 변환하려면 BEGIN 및 END 라인을 제거하고 base64를 linebreaks_를 무시한 바이너리로 변환해야합니다. 일부 base64 디코더는 자동으로 줄 바꿈을 무시하지만 다른 일부는 사용자가 먼저 제거해야합니다. "X.509"(실제로 SPKI) 및 "PKCS # 8"을 처리하는 _KeyFactory_ 인스턴스는 변환해야하므로 DER이 필요합니다. –

관련 문제