我在 Azure 門戶免費訂閱上獲得了一個訪問令牌,標題是:{ "typ": "JWT", "alg": "RS256", "x5t": "7_Zuf1tvkwLxYaHS3q6lUjUYIGw", "kid": "7_Zuf1tvkwLxYaHS3q6lUjUYIGw"}所以我從這里得到 x5c ,然后放-----開始證書----- MIIDBTCCAe......cNpO9oReBUsX -----結束證書----- ze7xq1zGljQihJgcNpO9oReBUsX在https://jwt.io/ 中,簽名已驗證。但是,當我嘗試使用 jjwt 和 jose4j 使用 JDK1.8 驗證簽名時,按照此參考中的步驟,我在線上得到以下異常PublicKey publicKey = keyFactory.generatePublic(keySpec);java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:204)at java.base/java.security.KeyFactory.generatePublic(KeyFactory.java:352)at com.ipscape.api.v1_0.external.other.JwtExample.decodeJwt(JwtExample.java:41)at com.ipscape.api.v1_0.external.other.JwtExample.main(JwtExample.java:72)Caused by: java.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)at java.base/sun.security.x509.X509Key.decode(X509Key.java:396)at java.base/sun.security.x509.X509Key.decode(X509Key.java:401)at java.base/sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:86)at java.base/sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:297)at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:200)使用 jose4j 的代碼: X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyPEM.getBytes())); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); JwtConsumer jwtConsumer = new JwtConsumerBuilder() .setRequireExpirationTime() .setVerificationKey(publicKey) .build();
InvalidKeySpecException 數據不是對象 ID (tag = -96)
慕的地8271018
2021-08-04 17:38:36