为了账号安全,请及时绑定邮箱和手机立即绑定

使用私钥生成 JSON Web 令牌 (JWT)

使用私钥生成 JSON Web 令牌 (JWT)

呼唤远方 2023-09-27 21:23:27
我正在尝试生成 JWT 但收到此错误:openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt我正在使用该io.jsonwebtoken.Jwts库和字符串形式的私钥,但出现错误。Map<String, Object> payload = new HashMap<>();payload.put("iss", orgId);payload.put("sub", accountId);payload.put("exp", expirationTime);payload.put("aud", new StringBuilder("Url").append("/c/").append(apiKey).toString());payload.put(new StringBuilder("Url").append("/s/entt_sdk").toString(), Boolean.TRUE);return Jwts.builder().setClaims(payload).**signWith**(SignatureAlgorithm.RS256, privateKeyStr).compact();java.lang.IllegalArgumentException: Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.我的私钥如下所示:-----BEGIN PRIVATE KEY-----sajdkjsadkjsahdkjsadksadkjsadkjs-----END PRIVATE KEY-----
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

错误非常简单 - 该方法只能用于 Hmac 算法。对于基于 RSA 的算法,您必须使用signWith(SignatureAlgorithm, Key).


我将使用的密钥不是 PEM 格式 - 它将是 base64 DER 编码的字符串 - 为此,我必须删除该密钥的 PEM 格式的开头和结尾 ------BEGIN PRIVATE KEY-----并且-----END PRIVATE KEY-----:


MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9/xBGBRhpSBa/

Xc/5CeAQjjVMcXfIFOqeIc/kq7dnsLz+ntTrvTE3fyz0E8J8MLMTNypK7irt8MB0

0Gpm/NJHnLSGqgSqIXAvUbUsxCO8ULSTKLTQs4RiDbUtOWZgacvRN0IYRnN2tDWf

DWTYAElBSValTt/jvHw72BMcLXd8plGQYYD52l6+w/7ENgLG+hNbVewdM/saJKyL

Y/jhRl758XWGw5bCmIYk9BCbUVDLc5PN+iiYoBFTQYwP0Y1ln58vNZ/CDBw2mW3q

TyploxoAdmG86km4EK2mtlhWBaUshfHORxGkWlCXcwazWDoc5QJ24McaYbcQOcPW

lLDgP8MvAgMBAAECggEAHDX6MZtiE4fbsNB6J+06ctrauR4D/hZ0+8PjfX2tvty0

Q05MKTCvVSEyCI/CifQlMs43HmccwrXDrdSgZ+hURMPU3kXyaVyLrssADsSU1cpZ

9ZvOtUpidri4VR23wMsUs1z0GGylilOZvqMbfSMVvXbpQaRjhAohnDUqKT3rBvvd

fqO8KFl8FCgMEbbPvym5tJvrYfe9WalisnrGrrCZoaBmR5dEbjUfWrMg6bMcfPlz

rVaney8+UdFu15RUXTno3mu+glIYz1MyYk6LdlgBrb19gBscykqi0wYhZ312Yk0B

SXx+RIi49oZy7IU4jybzOSqWL79L4rQdvtBrp/dx6QKBgQDn/XeuCATwLdFyeo4/

ksVlhXIp9ykAZSFk/wnapcsvLSV59edI8mkslAwTTbgqPn0hvxVdwf0k23wipkGl

FiujHMCGoeT9ZwYs9uDEkGABATXomr7eC64AEfuUnUZMj3s0BgG5S/mGonlkIlTt

RpvxzMeYnRvLjDXZMP7FKCz0DQKBgQDRqPq+w7MQFBaBMTE7+685QeR+xxGnMipW

Qf579E++ihslGx6LztQnFhbah2VEVCPBq7R/BiEHiW4bA+DiTC8HnMsZi3jhlO9q

yw0DSZUSX8vsgNW2ghJOF9JnZEbptN3RlD11koSvkFZiUuxHYa0n6ti38CwfLxgV

MCuL5XOZKwKBgGi4CqD9L7V3CTdiyPk7eG1mOm1lCxYJkHR1h24yLrCB8YvHC3rr

Kbycq4K/L2WqRXPJPIzQ90L+7F77q2AozNPZM7LSO3qDWc9MNZOlFCD/+eSgjY3P

ueCAPY8NG2GN1vBZ0cdh2yYCC0e/E5TzrYsNg/+I07Yi+V+r9STsCLa1AoGAJnJo

WOcmRQKKBfLxZmCHB2bv8dergw+N9/duJWjt3rEQvUM13Ml22hwQ4M4HYfpT/EXy

eYC0Od+X01houtbhoPG9xNdwuV1Icjr+DeZGcfIjQSF3D1rW5H811EPtRRonuzEF

/DN8JX3AeZNfRM/CoxlL2J8wWB+YuPn2YlcXVbUCgYEAmVETM7+OBW9YKtv6zvKe

OZeZUIDIUZDqZgLd3IT7rikVCedIljWNhroXU1wNMssJPkfiQToGaykUMbBcgZKI

neU2IuYWaLXBN9oAj1u7/YQ0DpPqk/Sb2FpVX5eKfp4cu8XdyezxNuFFsPVdGBhB

xhqJOJuUc/ZKbo5Stc3NXEE=

以下是如何读取此密钥并使用它签署 JWT 的示例:


//create payload

Map<String, Object> payload = new HashMap<>();

payload.put("iss", "orgId");

payload.put("sub", "orgId");

payload.put("exp", "orgId");

payload.put("aud", new

StringBuilder("Url").append("/c/").append("key").toString());

payload.put(new StringBuilder("Url").append("/s/entt_sdk").toString(), Boolean.TRUE);


// read key

String privateKeyB64 = Files.lines(Paths.get("src/main/resources/private.key")).collect(Collectors.joining());

byte[] privateKeyDecoded = Base64.getDecoder()

                .decode(privateKeyB64);


//create key spec

PKCS8EncodedKeySpec spec =

                new PKCS8EncodedKeySpec(privateKeyDecoded);


// create key form spec

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PrivateKey privateKey = keyFactory.generatePrivate(spec);


//create signed JWT - JWS

String jws = Jwts.builder().setClaims(payload).signWith(SignatureAlgorithm.RS256, privateKey).compact();


System.out.println(jws);

请注意,我使用的是PKCS8EncodedKeySpec因为您的密钥似乎是 PKCS8 格式。输出是:


eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJvcmdJZCIsImF1ZCI6IlVybC9jL2tleSIsImlzcyI6Im9yZ0lkIiwiZXhwIjoib3JnSWQiLCJVcmwvcy9lbnR0X3NkayI6dHJ1ZX0.m8ASk4kUNx41csikpd0zALLQTjwG2pc0Ba0D9PGLVbI2NaY0IIXgaVVVJcIERz4ejj_jfq436v6v0_QnxdmvjMAnx88UmHGdrCT0V5MZl008LP4g4LrV-WczNltCUpoJQ-4CW6xkpXD03JIDQAYwaKb-PIOtm-pfLJhPPmxykc8QioueijhI5M__Pq5Nq0JCbkQxfGzxE5m_gJwwq7n290RBGRYH6AHeClaEJhDzLNitIejNvvua4zNNC6S1CHsa4ChaEFfRb9bi-jNEQW27IGhrKRCtuwleFwigl7oTIsyaRWlzuVNYcZHS707Z2o6Mkf9hDo8AGKURUVsJgA8WIg

我在 Java 8 上测试了它。对于 Java 11,我收到一条错误,缺少有关 XML 处理的模块。


查看完整回答
反对 回复 2023-09-27
  • 1 回答
  • 0 关注
  • 246 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信