边缘零信任(第3部分)
时间:2025-02-18 14:48:59 180浏览 收藏
大家好,我们又见面了啊~本文《边缘零信任(第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)包含在令牌的头部。验证系统读取alg
和kid
,并使用具有相同kid
的公钥验证签名。JWKS是一个JSON对象,包含一个或多个包含其kid
的公钥。令牌头部包含kid
声明:
{
"alg": "rs256",
"typ": "jwt",
"kid": "12345"
}
kid
可以是任何字母数字字符串。JWKS包含一个密钥数组,每个密钥对象如下:
{
"kty": "RSA",
"use": "sig",
"kid": "12345",
"n": "...",
"e": "..."
}
请注意每个密钥都有一个kid
;令牌头部必须包含相同的kid
才能加载正确的公钥。 n
和e
包含构建公钥所需的信息。库如jsrsasign可以导入这些信息并构建用于验证令牌的公钥。
JWKS的访问和更新
虽然JWKS提供了多密钥管理的序列化格式,但手动更新多个端点上的JWKS仍然很麻烦。更好的策略是利用自动发现,将密钥集托管在一个已知的URI上,以便客户端可以定期自动更新。例如,Microsoft Azure AD将其JWKS存储在https://login.microsoftonline.com/common/discovery/v2.0/keys。 当需要轮换密钥时,只需将新的公钥添加到集合并重新发布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令牌签名过程的差异
今天关于《边缘零信任(第3部分)》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
125 收藏
-
209 收藏
-
292 收藏
-
172 收藏
-
412 收藏
-
186 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习