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

Python中使用Gravitee公钥解码JWT报PEM无起始行错误如何解决

解决方案

报错核心原因:error:0909006C:PEM routines:get_name:no start line 表示OpenSSL无法识别你传入的公钥PEM格式,按以下步骤依次修正即可:

  • 校验settings.GRAVITEE_PUBLIC_KEY的存储内容
    确保配置项仅包含公钥的Base64编码本体,没有多余的空格、换行、转义符、引号,也没有从页面复制时带的冗余说明文字,这类冗余字符是导致格式校验失败的最常见原因。
  • 修正公钥格式化逻辑
    不要硬编码拼接换行符,先清除公钥内容中的所有空白字符,再按PEM规范每64个字符插入一个换行,避免单行长度不符合要求。修正后的_get_pubkey方法参考:
def _get_pubkey(self):
    # 清除所有空白字符
    raw_key = settings.GRAVITEE_PUBLIC_KEY.strip().replace(" ", "").replace("\n", "").replace("\r", "")
    # 按64字符长度拆分加换行,符合PEM格式要求
    formatted_key = "\n".join([raw_key[i:i+64] for i in range(0, len(raw_key), 64)])
    # 拼接完整PEM结构并转成ascii编码
    return f"-----BEGIN PUBLIC KEY-----\n{formatted_key}\n-----END PUBLIC KEY-----".encode("ascii")
  • 删除无效的校验代码
    PyJWT 2.x版本的jwt.decode方法返回的是Payload字典对象,不存在validate方法,这行代码在密钥解析问题修复后会直接抛出异常。如果需要额外校验JWT的过期时间、签发方、受众等属性,直接在decode方法中添加对应参数即可,参考:
claims = jwt.decode(
    token, 
    key=public_key, 
    algorithms=['RS256'],
    options={"verify_exp": True},
    issuer="实际的Gravitee签发地址",
    audience="实际的受众标识"
)
  • 无需修改公钥标识
    你当前使用的PyJWT 2.3.0和cryptography 36.0.0版本兼容RS256算法校验,不需要修改公钥的开头标识为BEGIN RSA PUBLIC KEY,Gravitee默认导出的是SPKI格式公钥,对应BEGIN PUBLIC KEY标识即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04