使用JWK生成RS256带KID的JWT时报错:期望PEM格式密钥
错误根因
你使用的PyJWT库的RS256签名算法,只接受PEM格式的密钥字符串、或者cryptography库生成/解析后的RSA私钥对象作为密钥入参。你当前直接传入了JWK格式的Python字典,不符合参数要求,所以抛出格式错误。
修复步骤
- 先安装处理JWK格式的依赖库:
pip install jwcrypto pyjwt cryptography
- 修改代码,将JWK格式私钥转为PEM格式后再调用签名逻辑,完整可运行代码如下:
import jwt from jwcrypto import jwk body = { "sub": "createjwt", "iss": "sktestissuer", "exp": 9283750542 } # 这里是你的JWK格式私钥,注意替换为真实的参数值,示例值无法正常签名 private_key_jwk = { "p": "atewtwetwqetasdfaerawerqwerqwur", "kty": "RSA", "q": "atewtwetwqetasdfaerawerqwerqwF", "d": "atewtwetwqetasdfaerawerqwerqw", "e": "ABCD", "use": "sig", "kid": "test_key", "qi": "atewtwetwqetasdfaerawerqwerqw", "dp": "atewtwetwqetasdfaerawerqwerqw", "dq": "atewtwetwqetasdfaerawerqwerqw", "n": "atewtwetwqetasdfaerawerqwerqw" } # JWK转PEM格式 jwk_obj = jwk.JWK(**private_key_jwk) private_key_pem = jwk_obj.export_to_pem(private_key=True, password=None) # 生成带KID的JWT encoded = jwt.encode( body, private_key_pem, headers={"kid": "test_key"}, algorithm="RS256" ) print(encoded)
补充说明
- 如果你本身持有PEM格式的私钥文件,不需要走JWK转PEM的逻辑,直接读取PEM文件内容传入
jwt.encode即可。 - 你示例代码里的JWK参数都是测试占位值,实际运行时需要替换为合法的RSA密钥参数,否则会抛出参数非法错误。
内容的提问来源于stack exchange,提问作者SKK
相关产品推荐
相关产品推荐

