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

Python中JWT使用RS384算法时密钥反序列化报错的原因与解决

RSA私钥JWT签名错误分析与修复

问题场景

执行以下代码时触发解码错误:

client_secret1 = "123"
client_secret2 = '''
-----BEGIN RSA PRIVATE KEY-----
123
-----END RSA PRIVATE KEY-----
'''

payload = {
    "iss": f"{client_id}",
    "sub": f"{client_id}",
    "aud": f"{token_endpoint}",
    "jti": "daflifnsorf",
    "exp": 60*5
}

jwt_token = jwt.encode(payload, key=client_secret2, algorithm="RS384").decode()

错误信息:

ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [<OpenSSLError(code=75497572, lib=9, reason=100, reason_text=bad base64 decode)>])


错误原因

核心问题是client_secret2的内容不符合RSA私钥格式要求:RSA私钥在-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----之间的内容,必须是经过Base64编码的ASN.1 DER格式密钥数据,而你填入的"123"不是合法的Base64编码内容,直接触发了解码失败。

修复步骤

  1. 生成合法RSA私钥
    使用OpenSSL工具生成标准格式的RSA私钥:
    openssl genrsa -out private_key.pem 2048
    
    生成的私钥包含完整的Base64编码块,示例如下:
    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEAzXaLz7...(省略完整Base64内容)...
    -----END RSA PRIVATE KEY-----
    
  2. 替换无效密钥
    将生成的私钥完整内容复制到client_secret2中,确保标记和中间的Base64块无缺失、无多余空格或换行。
  3. 验证算法匹配
    RS384是RSA非对称签名算法,确认使用的是RSA私钥而非EC等其他类型密钥。

关于client_secret1的说明

client_secret1 = "123"本身格式没问题,但不能用于RS384算法:RS384依赖RSA私钥进行非对称签名,而纯字符串密钥仅适用于HS256/HS384这类对称加密算法。如果要使用client_secret1,需修改算法为对称类型,代码示例:

jwt_token = jwt.encode(payload, key=client_secret1, algorithm="HS384").decode()

同时要确保认证服务端也配置了相同的对称密钥和匹配的算法。

内容的提问来源于stack exchange,提问作者coolest-duck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:30