当前位置: 代码网 > it编程>网页制作>html5 > 边缘零信任(第3部分)

边缘零信任(第3部分)

2025年03月30日 html5 我要评论
利用json web密钥集扩展jwt验证上一篇文章中,我们学习了json web令牌(jwt)的概念、创建方法和验证方式。第二部分则演示了如何在简单的express服务器中使用jwt验证中间件。本篇将

边缘零信任(第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://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令牌签名过程的差异

以上就是边缘零信任(第3部分)的详细内容,更多请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com