0

0

边缘零信任(第3部分)

聖光之護

聖光之護

发布时间:2025-02-18 08:02:01

|

632人浏览过

|

来源于php中文网

原创

边缘零信任(第3部分)

利用JSON Web密钥集扩展JWT验证

上一篇文章中,我们学习了JSON Web令牌(JWT)的概念、创建方法和验证方式。第二部分则演示了如何在简单的Express服务器中使用JWT验证中间件。本篇将深入探讨非对称加密算法,特别是RS256算法,并重点介绍JSON Web密钥集(JWKS)。

术语解释

在开始之前,先了解以下几个关键术语:

  • JWT (JSON Web Token): 每个请求都需要验证的用于身份验证的信息。
  • 算法: JWT使用哈希和签名算法对有效负载进行签名。主要分为两种:
    • 对称算法 (例如HS256): 使用相同的密钥进行签名和验证。
    • 非对称算法 (例如RS256, ES256, PS256): 使用公钥/私钥对。私钥用于签名,公钥用于验证。 理解底层哈希和签名算法的细节并非理解核心工作流程的必要条件。
  • JSON Web密钥集 (JWKS): 本篇的重点,用于管理密钥轮换。
  • 公钥/私钥: 一对加密证书,私钥用于签名,公钥用于验证。公钥可以公开,而私钥必须保密。

JWKS的优势

第二部分中,我们演示了根据令牌的alg声明和环境变量或公钥来验证对称或非对称算法。本部分将专注于非对称算法,特别是RS256。

使用公钥/私钥对的优势在于,验证过程无需私钥离开签名服务器。公钥可以公开,且无法反向推导出私钥。因此,公钥可在任何地方加载,从而实现任何地方的令牌验证。

然而,如果定期轮换公钥(强烈建议这样做),就会出现一个短暂的窗口期,导致证书不匹配:服务器使用新的私钥签名令牌,而验证端点仍持有旧的公钥,导致验证失败。JWKS提供了一种更优的密钥轮换管理方法。

当发行系统签署JWT时,用于签名的私钥的kid(密钥ID)包含在令牌的头部。验证系统读取algkid,并使用具有相同kid的公钥验证签名。JWKS是一个JSON对象,包含一个或多个包含其kid的公钥。令牌头部包含kid声明:

{
  "alg": "rs256",
  "typ": "jwt",
  "kid": "12345"
}

kid可以是任何字母数字字符串。JWKS包含一个密钥数组,每个密钥对象如下:

{
  "kty": "RSA",
  "use": "sig",
  "kid": "12345",
  "n": "...",
  "e": "..."
}

请注意每个密钥都有一个kid;令牌头部必须包含相同的kid才能加载正确的公钥。 ne包含构建公钥所需的信息。库如jsrsasign可以导入这些信息并构建用于验证令牌的公钥。

白瓜AI
白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

JWKS的访问和更新

虽然JWKS提供了多密钥管理的序列化格式,但手动更新多个端点上的JWKS仍然很麻烦。更好的策略是利用自动发现,将密钥集托管在一个已知的URI上,以便客户端可以定期自动更新。例如,Microsoft Azure AD将其JWKS存储在https://www.php.cn/link/7153f307b5c0c430849e99573d3f3176。 当需要轮换密钥时,只需将新的公钥添加到集合并重新发布JWKS即可。客户端定期轮询URI获取最新的公钥。

密钥生成

前面提到了公钥/私钥对。您可以自己生成,但通常不建议使用自签名密钥,因为某些云提供商和验证软件包不允许使用。 建议使用Let's Encrypt生成签名的密钥。

首先,确保已安装并更新Certbot。然后,使用以下命令生成2048位RSA私钥:

certbot certonly \
  --manual \
  --preferred-challenges dns-01 \
  --key-type rsa \
  -d jwks01.yourdomain.com

Certbot会提供一个TXT记录,需要将其添加到_acme-challenge.jwks01.yourdomain.com。(子域名称可自定义)。验证后,Certbot会在默认位置(例如/etc/letsencrypt/live/jwks01.yourdomain.com)生成四个文件。我们主要关注privkey.pem(RSA私钥)和fullchain.pem(证书签名链)。将这两个文件复制到项目目录。

使用以下命令从私钥生成公钥:

openssl rsa -in privkey.pem -pubout -out pubkey.pem

您现在拥有签名的RSA私钥及其对应的公钥。 下一部分将介绍如何修改之前的Express-JWT示例,以导入这些密钥,在已知的URI上提供JWKS服务,并使用JWKS验证由不同私钥签名的多个令牌。

进一步阅读:

  • 私钥和公钥 - ssl.com快速入门
  • JWKS属性 - Auth0对JSON Web密钥属性的深入探讨
  • RSASSA-PSS - 深入了解RSXXX令牌和PSXXX令牌签名过程的差异

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6091

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

805

2023.09.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号