PyJWT 密钥获取实战:使用 cryptography 从 x509 证书中提取公钥/私钥完成 JWT 签名与验签
后端认证鉴权【免费下载链接】pyjwtJSON Web Token implementation in Python项目地址https://gitcode.com/gh_mirrors/py/pyjwt点击查看免费下载本文讲解如何借助cryptography库的load_pem_x509_certificate()函数从 PEM 格式的 x509 证书中提取公钥与私钥对象并将它们直接用于 PyJWT 的 RS256、ES256、EdDSA 等非对称算法的 token 签发与验证。读完本文你将掌握「证书 → 密钥对象 → JWT 签名/验签」的完整链路并了解 PyJWT 内部对 PEM 密钥与证书的解析与校验逻辑。场景为什么需要从 x509 证书中提取密钥PyJWT 的对称算法HS256/HS384/HS512直接使用一段共享的字节串作为密钥而非对称算法RS256、RS384、RS512、ES256、ES384、ES512、PS256、EdDSA 等则需要 RSA、EC 或 Ed25519/Ed448 密钥对象参与签名与验签。在真实生产环境中这些非对称密钥往往不是孤立存放的而是以x509 证书的形式分发企业/组织签发的 TLS 证书链中携带公钥服务端用它向客户端证明身份自签名的测试证书如仓库 tests/keys/testkey_rsa.cer同时承载公钥与私钥用于本地开发与单元测试当 JWT 签发方与验证方通过证书交换信任关系时验证方只需要从对方的证书里取出公钥即可完成 token 验签。此时最直接的做法就是解析证书对象再从证书对象中取出密钥。前置条件安装 cryptographyPyJWT 本身并不内联实现 RSA/EC/EdDSA 等密码学原语而是委托给cryptography库。查看源码 jwt/algorithms.py 中requires_cryptography集合jwt/algorithms.py#L126-L139可以看到RS256/RS384/RS512/ES256/ES256K/ES384/ES521/ES512/PS256/PS384/PS512/EdDSA全部依赖cryptography只有 HS256/HS384/HS512 与none可以在不安装它的情况下工作。因此使用证书提取密钥并配合非对称算法时需要先安装$ pip install PyJWT cryptographyPyJWT主包安装方式见 README.rstpip install PyJWT。核心方法load_pem_x509_certificate() 提取公钥/私钥官方 FAQdocs/faq.rst给出的解决方案非常直接使用cryptography.x509中的load_pem_x509_certificate()加载 PEM 格式证书然后通过证书对象的public_key()与private_key()方法取出对应密钥。从内存字节加载证书from cryptography.x509 import load_pem_x509_certificate cert_str b-----BEGIN CERTIFICATE-----MIIDETCCAfm... cert_obj load_pem_x509_certificate(cert_str) public_key cert_obj.public_key() private_key cert_obj.private_key()要点说明load_pem_x509_certificate()的入参是bytes 类型的 PEM 证书内容以-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾。传入str会报类型错误传真实文件内容时务必以二进制模式读取。public_key()返回RSAPublicKey/EllipticCurvePublicKey/Ed25519PublicKey等cryptography公钥对象可用于验签。private_key()返回对应的私钥对象可用于签名。注意该方法仅在证书本身包含私钥时才可用——典型场景是自签名证书或带私钥的证书/密钥对文件由 CA 签发的常规终端实体证书通常不含私钥此时调用private_key()会抛出异常私钥应另行从私钥文件中加载见下文。从证书文件加载实际开发中密钥通常存放在文件中配合pathlib或内置open读取from pathlib import Path from cryptography.x509 import load_pem_x509_certificate cert_bytes Path(server_cert.pem).read_bytes() cert_obj load_pem_x509_certificate(cert_bytes) public_key cert_obj.public_key() # 用于 JWT 验签仓库测试 tests/test_algorithms.py 中正是采用这种方式加载测试证书testkey_rsa.cer后再调用public_bytes(Encoding.DER)将其转换为 DER 格式用于防御性测试可作为文件加载的标准写法参考。与 PyJWT 实战结合签发与验证 JWT提取出的cryptography密钥对象可以直接作为jwt.encode()与jwt.decode()的key参数使用——PyJWT 的算法层原生接受这类密钥对象。用证书中的公钥验证 token验签端import jwt from pathlib import Path from cryptography.x509 import load_pem_x509_certificate # 1. 从对方/自己服务的证书中取出公钥 cert_bytes Path(server_cert.pem).read_bytes() public_key load_pem_x509_certificate(cert_bytes).public_key() # 2. 验证 token必须显式指定允许的算法白名单 claims jwt.decode( token, keypublic_key, algorithms[RS256], # 根据实际签名算法选择 RS256/ES256/EdDSA 等 ) print(claims)用证书中的私钥签发 token签名端import jwt from pathlib import Path from cryptography.x509 import load_pem_x509_certificate # 仅当证书本身携带私钥时可用如自签名证书 private_key load_pem_x509_certificate( Path(server_cert.pem).read_bytes() ).private_key() token jwt.encode( {sub: user-123, role: admin}, keyprivate_key, algorithmRS256, )底层原理PyJWT 如何接受这些密钥对象在签名流程中jwt/api_jws.py的编码逻辑会先通过get_algorithm_by_name()拿到对应算法对象再调用alg_obj.prepare_key(key)对密钥做归一化处理jwt/api_jws.py#L199-L202。以 RSA 为例RSAAlgorithm.prepare_key()jwt/algorithms.py#L530-L561的逻辑是如果传入的 key 已经是RSAPrivateKey/RSAPublicKey类型的cryptography对象直接返回from cryptography.x509提取出的正是这种对象因此无需二次转换如果传入的是 PEM 字符串/字节则依次尝试load_pem_private_key()与load_pem_public_key()解析解析失败抛出InvalidKeyError。这也意味着从证书中提取的公钥/私钥对象与直接传入 PEM 字符串open(key.pem).read()在 PyJWT 内部是等效的两条路径——前者适合密钥以证书形式托管的场景后者适合密钥独立以 PEM 文件存放的场景。将提取出的密钥导出为 PEM 再传入如果希望显式控制密钥格式例如打印、归档或传给不支持对象形式的 API可以用public_bytes()导出from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat pem public_key.public_bytes( encodingEncoding.PEM, formatPublicFormat.SubjectPublicKeyInfo, ) token_claims jwt.decode(token, keypem, algorithms[RS256])注意事项与安全边界1. 证书不能当作 HMAC 密钥使用把证书内容直接当作 HS256 的密钥是常见误区。PyJWT 对此有专门防御HMACAlgorithm._is_der_key()jwt/algorithms.py#L328-L344会尝试用x509.load_der_x509_certificate()识别 DER 证书一旦命中就抛出InvalidKeyError错误信息明确提示证书不应被用作 HMAC 密钥。仓库测试 tests/test_algorithms.py#L348-L356test_hmac_prepare_key_rejects_der_certificate验证了这一行为将证书转为 DER 后传给HMACAlgorithm.prepare_key()必然抛错。这是防止算法混淆攻击把非对称密钥降级为对称密钥的关键防线。2. 私钥提取的前提Certificate.private_key()只在证书携带私钥常见于自签名证书或导出时同时包含私钥的证书文件时可用CA 签发的证书只含公钥私钥需通过load_pem_private_key()从独立的.key/.pem私钥文件加载PyJWT 自身在 jwt/algorithms.py#L548-L552 也正是这样解析 PEM 私钥的。私钥属于敏感材料签发场景应存放于受控环境如密钥管理服务、受保护文件系统切勿随证书公开分发。3. 算法白名单必须显式指定jwt.decode()要求显式传入algorithms参数jwt/api_jws.py#L247-L250 会在缺失时抛出DecodeError。这是为了防止攻击者篡改 token 头部中的alg字段引发算法混淆务必只允许你信任的算法。4. 曲线与算法匹配从证书中提取出的 EC 公钥必须与算法约定的曲线匹配。例如 ES256 对应 P-256secp256r1、ES384 对应 P-384PyJWT 的ECAlgorithm._validate_curve()jwt/algorithms.py#L716-L725会在密钥曲线不符时抛出InvalidKeyError。RSA 密钥还受最小长度检查约束_MIN_KEY_SIZE 2048低于该值会触发InsecureKeyLengthWarning见 jwt/algorithms.py#L516-L528。扩展阅读与仓库证据官方 FAQ 原文docs/faq.rst算法注册表与requires_cryptography依赖清单jwt/algorithms.pyRSA 密钥解析实现prepare_key/load_pem_private_key/load_pem_public_keyjwt/algorithms.py证书防御性测试拒绝证书作为 HMAC 密钥tests/test_algorithms.py测试证书文件tests/keys/testkey_rsa.cerJWT 编码/验证主流程jwt/api_jws.py总结一下load_pem_x509_certificate()是从证书中提取公钥/私钥的标准入口提取出的cryptography密钥对象可直接交付给 PyJWT 的非对称算法完成 JWT 签发与验签同时要注意私钥是否真的存在于证书中、算法与曲线/密钥长度的匹配以及永远不要把证书内容当作 HMAC 对称密钥。赞分享后端认证鉴权【免费下载链接】pyjwtJSON Web Token implementation in Python项目地址https://gitcode.com/gh_mirrors/py/pyjwt点击查看免费下载相关推荐cryptography 库 RSA 公钥密码完全指南密钥生成、序列化、签名与加密实战cryptography 库 RSA 公钥密码完全指南密钥生成、序列化、签名与加密实战 RSA 是 cryptography 库中历史最悠久、使用最广泛的非对密码学Tink Java JWT 签名示例实战从密钥生成到签发与验证Tink Java JWT 签名示例实战从密钥生成到签发与验证 本指南以 Tink 官方 Java JWT 签名示例 java_src/examples/j密码学Tink Python JWT 签名实战密钥生成、Token 签发与 JWK Set 验证完整指南Tink Python JWT 签名实战密钥生成、Token 签发与 JWK Set 验证完整指南 导读 本文以 Tink 官方 Python JWT 签名示密码学应用安全上一篇CoffeeScript 0.3.2 版本解析property 简写语法与从 Narwhal 到 Node.js 的引擎切换下一篇lark-cli 多维表格表单提交实战base form-submit 命令完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

SoftwareCopyright-Skill 软著鉴别材料规则全解析:前后 30 页代码选材、90 列折行与 Word 自动分页实战

SoftwareCopyright-Skill 软著鉴别材料规则全解析:前后 30 页代码选材、90 列折行与 Word 自动分页实战

AI 技能文档 【免费下载链接】SoftwareCopyright-Skill 中国软件著作权申请材料 生成器 Skills,本 Skills 通过阅读本地项目,自动生成全套 .docx 软著申请材料,全开源,无须再付费购买任何软著申请服务 项目地址: https…

2026/10/12 2:19:18 阅读更多 →
ant-design-blazor Select 分组选择器(GroupName)实战指南:Option Group 实现与键盘导航

ant-design-blazor Select 分组选择器(GroupName)实战指南:Option Group 实现与键盘导航

前端UI组件设计系统 【免费下载链接】ant-design-blazor 基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。 项目地址: https://gitcode.com/ant-design-blazor/ant-design-blazor 点击查看 免费下载 导读 本文以 ant-desig…

2026/10/12 2:19:18 阅读更多 →
Farm 项目调试方法论:Root Cause Tracing 根因回溯实战指南

Farm 项目调试方法论:Root Cause Tracing 根因回溯实战指南

前端构建构建工具开发工具 【免费下载链接】farm Extremely fast Vite-compatible web build tool written in Rust 项目地址: https://gitcode.com/gh_mirrors/fa/farm 点击查看 免费下载 导读 在调试复杂构建工具(如 Farm 这种以 Rust 为核心、Node.…

2026/10/12 2:19:18 阅读更多 →

最新新闻

WinForms Chart 时间轴实战:DateTime 转 OADate 与滚动条控制

WinForms Chart 时间轴实战:DateTime 转 OADate 与滚动条控制

简介:这份资源围绕VS自带Chart控件展开,面向需要在WinForms项目中实现时间轴图表的.NET开发者,重点解决x轴按时间刻度显示并配合滚动条浏览长时数据的问题。示例采用从Excel读取数据的方式,x轴时间格式为MM-dd HH:mm:ss:fff&#…

2026/10/12 4:02:25 阅读更多 →
Java微信退款接口实战:从签名、证书到异步回调与对账的完整链路

Java微信退款接口实战:从签名、证书到异步回调与对账的完整链路

简介:这是一份面向Java后端开发者的微信退款接口实现示例资源,聚焦商户在用户发起退款时通过API与微信服务器完成安全交互的完整流程。内容围绕Java网络编程、HTTPS安全通信、PKCS12证书管理、RSA2048数字签名与JSON数据处理展开,适合需要对接…

2026/10/12 4:02:25 阅读更多 →
iOS PDF电子签章实战:PDFKit绘制、坐标系与防篡改校验

iOS PDF电子签章实战:PDFKit绘制、坐标系与防篡改校验

简介:面向iOS开发者的PDF电子签章库,原生渲染与加载,体积控制得较小,适用于合同签署、贷款协议、单据确认等需要电子签章的移动场景,适合有一定Objective-C/iOS原生开发基础的工程师。资源共7个文件,压缩包…

2026/10/12 4:02:25 阅读更多 →
Linux实战100例:故障域分层与高危操作避坑指南

Linux实战100例:故障域分层与高危操作避坑指南

简介:本资源是面向Linux初学者与中级运维人员的实战型学习包,聚焦命令行操作、系统配置与常见故障排查,通过100个经典实例覆盖网络调用、Apache服务配置、错误代码解析等核心场景,帮助读者在真实环境中理解原理、积累排错经验。压…

2026/10/12 4:02:25 阅读更多 →
GLM-4源码包实战:从推理到LoRA微调与部署全流程

GLM-4源码包实战:从推理到LoRA微调与部署全流程

简介:GLM-4代码仓库完整源码包,面向大模型开发者、算法工程师及对本地部署感兴趣的技术爱好者,提供智谱AI第四代GLM系列模型的参考实现与基础使用框架。压缩包内共78个文件,包含Python脚本、YAML部署配置、JSON数据、Markdown说明…

2026/10/12 4:02:25 阅读更多 →
分红时代已死,资本证明时代崛起

分红时代已死,资本证明时代崛起

《分红时代已死,资本证明时代崛起》——下一轮能源周期,市场奖励的不是“投得更多”,而是“证明每一笔钱为何值得花”过去五年,能源公司靠不花钱赢得投资者;未来五年,要靠会花钱。投下去的是资本&#xff0…

2026/10/12 4:01:25 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →