我使用 keytool 生成了一个 RSA 密钥。
keytool -genkeypair -alias myAlias -keyalg RSA -dname ...
创建一个 jks。
我正在用这个签名..
String sig = Jwts.builder().setClaims(claims).setIssuedAt(new
Date(now)).setExpiration(expires.getTime()).signWith(
SignatureAlgorithm.RS256, myKey).compact();
并用于验证..
Certificate cert = keystore.getCertificate(myAlias);
PublicKey publicKey = cert.getPublicKey();
Jwt jwt = Jwts.parser().setSigningKey(publicKey).require("user",
"me").require("iotDevice", "123456789").parse(signature);
验证很好。
我为此证书创建了一个公钥..
keytool -export -alias myAlias -keystore myKeyStore.jks -file myPem.pem
openssl rsa -in myPem.pem -pubout > myApp.pub
我正在加载此公钥以再次验证..
RSAPublicKey getPublicKeyFromString(String key) throws IOException,
GeneralSecurityException {
String publicKey = key;
publicKey = publicKey.replace("-----BEGIN PUBLIC KEY-----\n", "");
publicKey = publicKey.replace("-----END PUBLIC KEY-----", "");
publicKey = publicKey.replace("\n", "");
byte[] encoded = Base64.getDecoder().decode(publicKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new
X509EncodedKeySpec(encoded));
return pubKey;
}
PublicKey publicKey2 = getPublicKeyFromString(keyString); // keyString has myApp.pub
Jwt jwt = Jwts.parser().setSigningKey(publicKey2).require("user",
"me").require("iotDevice", "123456789").parse(signature);
// 失败并显示消息
JWT 签名与本地计算的签名不匹配。JWT 有效性不能被断言,也不应该被信任。
任何帮助表示赞赏。
提前致谢