java - 如何使用 Java 从苹果 p8 文件中解析 jwt 签名密钥
问题描述
现在我想生成一个 JWT 令牌来请求苹果服务器遵循这个文档,我从苹果下载了 p8 文件,如何从 p8 文件中获取 jwt 签名密钥?这是我的 jwt 令牌生成代码:
Map<String,Object> jwtHeader = new HashMap<>();
jwtHeader.put("alg","ES256");
jwtHeader.put("kid","YDKL424AF9");
jwtHeader.put("typ","JWT");
Map<String,Object> appleJwtPayload = new HashMap<>();
appleJwtPayload.put("iss","5fb8e836-27d7-4390-8f40-008acd64a29d");
appleJwtPayload.put("iat",System.currentTimeMillis() / 1000L);
appleJwtPayload.put("exp",System.currentTimeMillis() / 1000L + 60 * 15);
appleJwtPayload.put("aud","appstoreconnect-v1");
appleJwtPayload.put("nonce",UUID.randomUUID().toString());
appleJwtPayload.put("bid","com.earth.dolphin");
String appleKey = "<how to get the apple key>";
SecretKey secretKey = new SecretKeySpec(appleKey.getBytes(), SignatureAlgorithm.ES256.getJcaName());
String accessToken = Jwts.builder()
.setClaims(appleJwtPayload)
.setHeader(jwtHeader)
.signWith(secretKey)
.compact();
我按照这个问题阅读了 KeyStore 代码,但我仍然不知道该怎么做,有人可以帮助我吗?
解决方案
像这样获取签名密钥:
byte[] p8der = Files.readAllBytes(Path.of("/opt/apps/dolphin-post/AuthKey_YDKL424AF9.p8"));
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(new org.apache.commons.codec.binary.Base64().decode(p8der));
PrivateKey appleKey = KeyFactory.getInstance("EC").generatePrivate(priPKCS8);
该文件AuthKey_YDKL424AF9.p8
是从苹果下载的,您应该删除文件的开始和结束标题。这是我获取私钥的完整功能:
public static PrivateKey getPrivateKey(String filename, String algorithm) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
try {
String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Java did not support the algorithm:" + algorithm, e);
} catch (InvalidKeySpecException e) {
throw new RuntimeException("Invalid key format");
}
}
你可以像这样使用它:
PrivateKey appleKey = SecurityUtil.getPrivateKey(APPLE_PRIVATE_KEY_PATH,"EC");
在APPLE_PRIVATE_KEY_PATH
我的操作系统中是:
apple.private.key.path=/opt/apps/dolphin-post/AuthKey.p8
将其更改为您的路径。
推荐阅读
- aws-lambda - AWS Lambda 的 KMS 解密权限
- android - 由于 bundleReleaseJsAndAssets,APK 无法构建发布
- visual-studio-code - VS Code Markdown - 有没有一种聪明的方法可以使链接变得智能?
- html - 相对于前面的文本元素定位 SVG 文本元素,没有硬 x/y 坐标?
- python - Python打印复选框值
- reactjs - TypeError:countrys.map 不是 react js 中的函数(当我点击国家视图或编辑然后国家链接时)
- reactjs - 构建一个选择选项下拉列表:对象作为 React 子项无效
- node.js - 如何使用节点和/或快递将 3D 模型文件发送到客户端?
- react-native - 更新由 RNSVGReact 管理的视图的属性“填充”时出错
- c# - 如果 value 小于零,则将 nullable int 设置为零