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
相关产品推荐
相关产品推荐

