You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向JsonWebSignature传入私钥?(基于jose4j 0.9.6)

解决jose4j中JsonWebSignature设置私钥的正确方式

当前代码的核心问题是误用PublicJsonWebKey.Factory.newPublicJwk(privateKeyPem)处理私钥PEM——这个类仅用于解析公钥JWK,无法正确加载私钥,导致无法获取有效的签名密钥。

正确的私钥加载方式

方式1:用RsaKeyUtil解析PEM私钥

jose4j提供了RsaKeyUtil工具类,可以直接解析PEM格式的RSA私钥,这是最适合你场景的方式:

// 导入所需类
import org.jose4j.keys.RsaKeyUtil;
import java.security.PrivateKey;

// 解析PEM私钥
RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
PrivateKey privateKey = rsaKeyUtil.parsePrivateKeyFromPem(privateKeyPem);

// 将私钥设置到JsonWebSignature对象
jws.setKey(privateKey);

方式2:通过JsonWebKey.Factory加载私钥JWK

如果你的私钥是以JWK格式存储的,也可以用以下方式加载(但你的场景是PEM,优先选方式1):

import org.jose4j.jwk.JsonWebKey;

JsonWebKey jwk = JsonWebKey.Factory.newJwk(privateKeyJwkString);
PrivateKey privateKey = (PrivateKey) jwk.getKey();
jws.setKey(privateKey);

修正后的完整代码

import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.keys.RsaKeyUtil;
import java.security.PrivateKey;

public class JwtSignatureExample {
    public static void main(String[] args) throws Exception {
        String consumerKey = "****************************************";
        String certificateId = "sdsdsdssdsdsdsdssdsdsdsfefer";
        String tokenEndpoint = "https://xxxxxxxxxxxxxxxxxxxxxx/token";

        String privateKeyPem = "-----BEGIN PRIVATE KEY-----\n"
                + "MII.......................\n"
                + ".........................Q3AFte\n "
                + "+**************************s=\n"
                + "-----END PRIVATE KEY-----";

        // 构建JWT声明
        JwtClaims claims = new JwtClaims();
        claims.setIssuer(consumerKey);
        claims.setAudience(tokenEndpoint);
        claims.setExpirationTimeMinutesInTheFuture(60);
        claims.setGeneratedJwtId();
        claims.setIssuedAtToNow();
        claims.setClaim("scope", "restlets rest_webservices");

        // 创建JWS并设置参数
        JsonWebSignature jws = new JsonWebSignature();
        jws.setPayload(claims.toJson());
        jws.setAlgorithmHeaderValue("PS256");
        jws.setKeyIdHeaderValue(certificateId);

        // 正确加载私钥
        RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
        PrivateKey privateKey = rsaKeyUtil.parsePrivateKeyFromPem(privateKeyPem);
        jws.setKey(privateKey);

        jws.setDoKeyValidation(false);

        // 生成签名后的JWT
        String jwt = jws.getCompactSerialization();
        System.out.println("Signed JWT: " + jwt);
    }
}

注意事项

  • 确保你的PEM私钥是有效的RSA私钥,因为PS256是RSA-PSS SHA-256算法,仅支持RSA密钥对。
  • setDoKeyValidation(false)关闭了密钥与算法的匹配验证,生产环境建议开启,避免使用错误类型的密钥。
  • 实际代码中需要捕获JoseException、InvalidKeyException等相关异常,示例中简化了异常处理。

内容的提问来源于stack exchange,提问作者MHegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:52:38