You need to enable JavaScript to run this app. 如何用Python以RS256算法用RSA私钥编码JWT实现DocuSign授权
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python以RS256算法用RSA私钥编码JWT实现DocuSign授权

核心报错根因

ValueError: cannot deserialize the data并非JWT编码逻辑错误,是PyJWT底层解析RSA私钥时触发的格式兼容问题:

  • HS256为对称加密算法,仅需传入字符串作为密钥即可完成运算,因此可正常运行
  • RS256为非对称加密算法,从PyJWT 2.0版本开始,要求传入的RSA密钥必须能被底层cryptography加密库正确解析为结构化密钥对象,只要密钥加载环节有疏漏,就会触发通用的反序列化失败报错,和是否误用公钥、PEM开头标识是否正确没有直接关联。
分步修复方案
  • 补全PyJWT的非对称算法依赖:仅安装基础版pyjwt包无法支持RS256的密钥解析逻辑,需要执行pip install pyjwt[crypto]安装带加密后端的完整版本,避免零散安装依赖拼凑环境。
  • 检查私钥字符串的换行完整性:从控制台复制私钥时,很容易丢失原本的多行换行格式,把带-----BEGIN RSA PRIVATE KEY-----开头的私钥存成无换行的单行字符串。哪怕首尾标识完全正确,缺少PEM要求的换行结构,cryptography库也无法正常解析。如果私钥存储在环境变量中,需要确保字符串里的换行被正确转义为\n,不要硬拼接为单行文本。
  • 提前加载私钥为结构化对象再传入编码接口:旧版本PyJWT支持直接把PEM字符串传入jwt.encode,但新版本兼容逻辑对格式要求更严格,正确的加载流程是先通过cryptography接口完成私钥解析,再把解析后的对象传给编码方法,示例代码如下:
from cryptography.hazmat.primitives import serialization
# 注意私钥内容为字节格式,保留正确换行结构
private_key_bytes = b"-----BEGIN RSA PRIVATE KEY-----\n你的实际密钥内容\n-----END RSA PRIVATE KEY-----"
# 如果私钥设置了保护密码,将password参数替换为对应的字节格式密码即可
private_key = serialization.load_pem_private_key(
    private_key_bytes,
    password=None
)
# 将解析完成的私钥对象传入jwt.encode
signed = jwt.encode(payload, private_key, algorithm='RS256')
  • 适配DocuSign的私钥要求:在DocuSign控制台生成集成密钥对应的RSA私钥时,需要导出无加密保护的PEM格式私钥。如果当初导出的私钥设置了访问密码,需要在加载私钥的password参数中传入对应密码,否则也会触发反序列化失败。

常见误区:多数修复方案要求将私钥转换为PEM格式,但PEM格式的核心是包含正确的换行结构和标准密钥头尾标识,不是只要开头带-----BEGIN RSA PRIVATE KEY-----就算合格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 15:06:03