2016-05-03 19 views
0

認証サーバー(OpenId)から取得した公開鍵でアクセストークンの署名を検証しようとしています。
クライアントは同じサーバーからアクセストークンを取得し、それにリソースサーバーAPIを要求します。今では、その署名をSpring Securityライブラリでチェックする必要があります。
アクセストークンには "alg": "RS256"属性があります。
しかし、以下のコードは、失敗したままで、私はいつも...JWT署名検証

import java.math.BigInteger; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.RSAPublicKeySpec; 

import org.apache.commons.codec.binary.Base64; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.security.jwt.JwtHelper; 
import org.springframework.security.jwt.crypto.sign.InvalidSignatureException; 
import org.springframework.security.jwt.crypto.sign.RsaVerifier; 

public class JWTValidation { 

    private static final Logger logger = LoggerFactory.getLogger(JWTValidation.class); 

    private static final String PUBLIC_KEY_MODULUS = "qOYyKKnoUpXd2qIj8A0tdumWwnDbVjXOVaPfiX5lxBvYEtgWPLknf1Nftdk371a7f1jD8SFFDxXnj-PPFx8qoNETOITvbR12uvWmS1J36B5Uo_ViHp7dC-GaZG_EdafyK0rxRPvK8b37NPXWhTggbxCZhYaqJUMb1t0xogDadEyM95lZweEXrwsJNzoyXiGnPfsRgy32TjOOXIMZnAMoj-osYd2WawymkRV6cteo3f8KMT72_kp8oG-kGm1s3ZooEfI3_9Z2jHVGWQLUWbmZKIrvjuUo2dhmqWWsNyTO3RsF4qyrRCpmZNawDf_GsioBTZ3vfPF_T58moH7cJ50Byw"; 
    private static final String PUBLIC_KEY_PUBLIC_EXPONENT = "AQAB"; 

    //Public key = 
// { 
//  "keys":[ 
//   { 
//   "kty":"RSA", 
//   "use":"sig", 
//   "kid":"DQr-GCc8rH3y5fkAuo0iau-ue-s", 
//   "x5t":"DQr-GCc8rH3y5fkAuo0iau-ue-s", 
//   "e":"AQAB", 
//   "n":"qOYyKKnoUpXd2qIj8A0tdumWwnDbVjXOVaPfiX5lxBvYEtgWPLknf1Nftdk371a7f1jD8SFFDxXnj-PPFx8qoNETOITvbR12uvWmS1J36B5Uo_ViHp7dC-GaZG_EdafyK0rxRPvK8b37NPXWhTggbxCZhYaqJUMb1t0xogDadEyM95lZweEXrwsJNzoyXiGnPfsRgy32TjOOXIMZnAMoj-osYd2WawymkRV6cteo3f8KMT72_kp8oG-kGm1s3ZooEfI3_9Z2jHVGWQLUWbmZKIrvjuUo2dhmqWWsNyTO3RsF4qyrRCpmZNawDf_GsioBTZ3vfPF_T58moH7cJ50Byw", 
//   "x5c":["MIIDBDCCAfCgAwIBAgIQt1HpvYkM6oxJ1ZjbpW1fPTAJBgUrDgMCHQUAMBkxFzAVBgNVBAMTDkRhdGFEb29ycyBUZXN0MCAXDTE1MDQwMjIyMjQwM1oYDzIwNTAwMTAxMDYwMDAwWjAZMRcwFQYDVQQDEw5EYXRhRG9vcnMgVGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjmMiip6FKV3dqiI/ANLXbplsJw21Y1zlWj34l+ZcQb2BLYFjy5J39TX7XZN+9Wu39Yw/EhRQ8V54/jzxcfKqDREziE720ddrr1pktSd+geVKP1Yh6e3QvhmmRvxHWn8itK8UT7yvG9+zT11oU4IG8QmYWGqiVDG9bdMaIA2nRMjPeZWcHhF68LCTc6Ml4hpz37EYMt9k4zjlyDGZwDKI/qLGHdlmsMppEVenLXqN3/CjE+9v5KfKBvpBptbN2aKBHyN//Wdox1RlkC1Fm5mSiK747lKNnYZqllrDckzt0bBeKsq0QqZmTWsA3/xrIqAU2d73zxf0+fJqB+3CedAcsCAwEAAaNOMEwwSgYDVR0BBEMwQYAQgtiIGHLzFEskZSe/65EOTqEbMBkxFzAVBgNVBAMTDkRhdGFEb29ycyBUZXN0ghC3Uem9iQzqjEnVmNulbV89MAkGBSsOAwIdBQADggEBADtIlf41MLeGwjTbhJS88stZEBhEexxXNJDlW92GKPVv0JJWD/5m8tfADzXOgP65rTyQ4lTGOFFRYQu0ajMYAzggqJTmU1rMrHxuVwLfJ3OpSOc9UZBs2gW/IUZFvSugMKNboTsfTPgpsHK1ag68NKvR/V209zYZd6A7zisGgUr2Oc5jNEj7lSQY6pME2ZXU0YppC6Dctj8XHkTO9Ji9vDj+iGoS4+RvHZ3cDr5YUbOKSooOAZ/kjqtm+VK2jdjdLrkduz/24NKIxEXQqhmM28f8kh5Wc2ilaMya9pxQZpTWk7sjOBkZCcw24tx6UqpSTsV/XnnTmJMIhgXFJXWnXFc="] 
//   } 
//  ] 
// } 

    //Access Token = base64url encoded String 
    public boolean verifySignature(String accessToken){ 

     try { 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");   
      Base64 decoder = new Base64(true);//URL-safe Base64 decoder 

      BigInteger modulus = new BigInteger(decoder.decode(PUBLIC_KEY_MODULUS.getBytes())); 
      BigInteger publicExponent = new BigInteger(decoder.decode(PUBLIC_KEY_PUBLIC_EXPONENT.getBytes())); 

      RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, publicExponent); 
      PublicKey newPublicKey = keyFactory.generatePublic(spec); 

      RsaVerifier verif = new RsaVerifier((RSAPublicKey) newPublicKey, "SHA256withRSA"); 
      JwtHelper.decodeAndVerify(accessToken, verif); 

     } catch (InvalidSignatureException e){ 
      logger.info(e.getMessage()); 
      return false; 
     } catch (Exception e){ 
      logger.info(e.getMessage()); 
      return false; 
     } 

     return true; 
    } 
} 

をInvalidSignatureExceptionを取得しています、私はまた、オンラインツールjwt.ioを使用しようとしましたが、私はそれを動作させることができていませんでした(署名遺跡無効)
そして、他の1(tool_jwt)のために、有効な署名を持っている唯一の方法は、自分の公開鍵「x5c」値の周りのコメントで「デフォルトX.509証明書RSA」を選択することです:

-----BEGIN CERTIFICATE----- 
    MIIDBDCCAfCgAwIBAgIQt1HpvYkM6oxJ1ZjbpW1fPTAJBgUrDgMCHQUAMBkxFzAVBgNVBAMTDkRhdGFEb29ycyBUZXN0MCAXDTE1MDQwMjIyMjQwM1oYDzIwNTAwMTAxMDYwMDAwWjAZMRcwFQYDVQQDEw5EYXRhRG9vcnMgVGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjmMiip6FKV3dqiI/ANLXbplsJw21Y1zlWj34l+ZcQb2BLYFjy5J39TX7XZN+9Wu39Yw/EhRQ8V54/jzxcfKqDREziE720ddrr1pktSd+geVKP1Yh6e3QvhmmRvxHWn8itK8UT7yvG9+zT11oU4IG8QmYWGqiVDG9bdMaIA2nRMjPeZWcHhF68LCTc6Ml4hpz37EYMt9k4zjlyDGZwDKI/qLGHdlmsMppEVenLXqN3/CjE+9v5KfKBvpBptbN2aKBHyN//Wdox1RlkC1Fm5mSiK747lKNnYZqllrDckzt0bBeKsq0QqZmTWsA3/xrIqAU2d73zxf0+fJqB+3CedAcsCAwEAAaNOMEwwSgYDVR0BBEMwQYAQgtiIGHLzFEskZSe/65EOTqEbMBkxFzAVBgNVBAMTDkRhdGFEb29ycyBUZXN0ghC3Uem9iQzqjEnVmNulbV89MAkGBSsOAwIdBQADggEBADtIlf41MLeGwjTbhJS88stZEBhEexxXNJDlW92GKPVv0JJWD/5m8tfADzXOgP65rTyQ4lTGOFFRYQu0ajMYAzggqJTmU1rMrHxuVwLfJ3OpSOc9UZBs2gW/IUZFvSugMKNboTsfTPgpsHK1ag68NKvR/V209zYZd6A7zisGgUr2Oc5jNEj7lSQY6pME2ZXU0YppC6Dctj8XHkTO9Ji9vDj+iGoS4+RvHZ3cDr5YUbOKSooOAZ/kjqtm+VK2jdjdLrkduz/24NKIxEXQqhmM28f8kh5Wc2ilaMya9pxQZpTWk7sjOBkZCcw24tx6UqpSTsV/XnnTmJMIhgXFJXWnXFc= 
-----END CERTIFICATE----- 

だから私は何を知っていないどのような公開鍵属性を使用するべきか、それをどのようにするか? RSA鍵仕様に私が使用に加えて、X509キースペックを持っていた

あなたの助けのおかげで多くのことを:)

+0

イムはまだこの問題に固執しています... tx – Tierce

答えて

2

RSAPublicKeySpec spec = new RSAPublicKeySpec(new BigInteger(modulusBytes),  new BigInteger(exponentBytes)); 
KeyFactory factory = KeyFactory.getInstance("RSA"); 
PublicKey key = factory.generatePublic(spec); 


X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(key.getEncoded()); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PublicKey pubKey64 = kf.generatePublic(X509publicKey); 

これはauth0とjwt.ioライブラリ

の両方のために働いていました
関連する問題