代码com.auth0 java-jwt 3.18.2
public static void verify(String jwt) throws CertificateException {
// 拿到 header 中 x5c 数组中第一个
DecodedJWT decodedJWT = JWT.decode(jwt);
String header = new String(java.util.base64.getDecoder().decode(decodedJWT.getHeader()));
String x5c0 = Jackson.arrOf(Jackson.fromTree(header), "x5c").get(0).asText();
// 获取公钥
PublicKey publicKey = getPublicKeyByX5c(x5c0);
// 验证 token
Algorithm algorithm = Algorithm.ECDSA256((ECPublicKey) publicKey, null);
algorithm.verify(decodedJWT);
}
public static PublicKey getPublicKeyByX5c(String x5c) throws CertificateException {
byte[] x5c0Bytes = java.util.base64.getDecoder().decode(x5c);
CertificateFactory fact = CertificateFactory.getInstance("X.509");
X509Certificate cer = (X509Certificate) fact.generateCertificate(new ByteArrayInputStream(x5c0Bytes));
return cer.getPublicKey();
}
参考的文档
验证 JWS 中的 RSA 签名
Java 从 x5c 中获取公钥
Java 使用公钥验证 JWT



