【问题标题】:how to parse jwt sign key from apple p8 file with Java如何使用 Java 从苹果 p8 文件中解析 jwt 签名密钥
【发布时间】:2022-03-02 08:19:52
【问题描述】:

现在我想生成一个 JWT 令牌来请求苹果服务器关注这个docs,我从苹果下载了 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();

我阅读了this question 的 KeyStore 代码,但我仍然不知道该怎么做,任何人都可以帮助我吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    像这样获取签名密钥:

    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
    

    将其更改为您的路径。

    【讨论】:

    • 嗨@Dolphin...我也面临同样的问题...您能否保留完整的工作代码...
    • 我已经粘贴了解析苹果私钥的完整代码,希望对你有帮助。 @karthikmunna
    • 谢谢@Dolphin ...但是我如何使用私钥生成JWT ...你能帮我吗..这就是我尝试过的... String accessToken=Jwts.builder () .setClaims(payloadClaims) .setHeader(headers) .signWith(SignatureAlgorithm.ES256,privateKey.toString().getBytes()) .compact();
    • 知道了... String accessToken=Jwts.builder() .setClaims(payloadClaims) .setHeader(headers) .signWith(SignatureAlgorithm.ES256,privateKey) .compact();
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2018-11-20
    • 1970-01-01
    • 2017-08-31
    • 2019-05-09
    • 2018-01-09
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多