2016-09-21 1 views
1

Я получаю jwt (токен доступа) с сервера OAuth. Сервер OAuth уже предоставил мне секретный, открытый ключ и самозаверяющий сертификат ЦС.Проверка jwt в java: байты ключа не могут быть указаны для подписей RSA

Я хочу написать код, который, когда я получаю jwt, могу проверить его и проверить, отправил ли этот сервер мне. Я использую следующий код для проверки моего jwt в java.

String jwt = "xxx.yyy.zzz"; 

     //This line will throw an exception if it is not a signed JWS (as expected) 
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(self_signed_CA_Certificate)) 
       .parseClaimsJws(jwt).getBody(); 

Я получаю ошибку: Key bytes cannot be specified for RSA signatures. Please specify a PublicKey or PrivateKey instance.

Любая помощь приветствуется.

ответ

-1

вы должны создать SecretKey с использованием RSA, как

SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); 
or 
Key secretKey = MacProvider.generateKey(); 

использования ключа же SecretKey для создания JWT строки и расшифровать его, используя тот же ключ, как секретируют

SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); 
String compactJws = Jwts.builder() 
        .setSubject("Joe") 
        .signWith(SignatureAlgorithm.HS512, secretKey) 
        .compact(); 


Claims claims = Jwts.parser().setSigningKey(secretKey) 
         .parseClaimsJws(compactJws).getBody(); 
+0

вам не требуется, чтобы создать ключ еще раз , вы пробовали с секретным ключом секретного сертификата CA. если они дали вам действительный ключ, он должен работать. в вашем коде вы пытаетесь использовать «секрет», который не является действительным ключом RSA. почему вы получаете ошибку. –

+1

Я попробовал то, что вы предложили: Claims Claim = Jwts.parser(). SetSigningKey (self_signed_CA_Certificate) .parseClaimsJws (jwt) .getBody(); но по-прежнему получают ту же ошибку. Может быть, я должен дать кодировку? например, аналогично использованию DatatypeConverter.parseBase64Binary? – Pegah

+0

self_signed_CA_Certificate это строковый или ключевой объект? если это строка id, то вы можете передать DatatypeConverter.parseBase64Binary –

Смежные вопросы