掌握JWKS:JSON Web密钥集详解
TL;DR
JWKS(JSON Web密钥集)是通过JSON对象标准化表示和管理加密密钥的工具。该技术在RFC 7517中定义,支持客户端本地JWT(JSON Web令牌)验证,是OpenID Connect和OAuth2等去中心化身份验证协议的重要组成部分。实施JWKS简化了密钥管理,便于密钥轮换,并确保密钥在多个服务器间的安全分发。
JWK和JWKS的技术规范
JWKS是JSON Web密钥集的缩写。它是用于验证JSON Web令牌(JWT)的JSON Web密钥(JWK)集合。这两种结构都在RFC 7517中定义,是著名JOSE标准家族的又一重要成员。JWK集为服务器提供了一种标准化方式和格式,以获取在本地验证非对称签名JWT所需的公钥。
什么是JSON Web密钥(JWK)?
JWK是表示加密密钥的JSON对象数据结构。它包含密钥类型、密钥操作、算法以及重建签名验证密钥所需的所有相关材料。所有官方支持的JSON Web算法(JWA)都在RFC 7518中定义。
JWK格式的JSON数据结构允许轻松、原生地在Web上交换公钥。曲线P-256的椭圆曲线签名密钥的表示可能如下所示:
|
|
什么是JSON Web密钥集(JWKS)?
JWKS是表示一组JWK的JSON对象。它必须包含一个"keys"成员和一个JWK数组。JSON Web密钥集使身份提供商能够在一个知名资源下支持和暴露多个公钥。以下示例JWK集格式包含两个公共加密密钥——一个使用椭圆曲线(EC)算法,第二个使用RSA算法:
|
|
定位JSON Web密钥集
许多现代身份提供商(如Google)通过OpenID Connect(OIDC)知名发现端点中的jwks_uri属性暴露其JWK集,该端点位于https://{identity-provider}/.well-known/openid-configuration,通常指向https://{identity-provider}/.well-known/jwks.json或类似资源。
使用JWKS的好处
使用JWK集轻松管理密钥
使用JWK的主要好处之一是它们提供了一种简单的方法来跨多个服务器或位置管理和分发密钥。令牌颁发者(授权服务器)无需将公钥硬编码到应用程序代码中,只需为其客户端提供其JSON Web密钥集的URL。
任何需要访问密钥的应用程序都可以从该远程位置检索它们。这消除了手动密钥分发的需要,解决并确保所有应用程序使用相同的密钥集。这使得管理多个密钥并在必要时轮换它们变得更加容易。
使用JWK简化密钥轮换过程
在使用加密的任何系统中,轮换密钥对于维护安全性至关重要。然而,手动替换这些密钥可能需要时间和精力。JWKS可以通过自动化密钥轮换来简化此过程。
由于JWK将授权服务器与依赖方应用程序解耦,令牌颁发者可以在必要时生成新的非对称密钥对。设置定期的密钥轮换间隔,发布新的公钥材料,并在一定的宽限期后自动使用最新的私钥,可以确保使用特定密钥签名的密钥数量具有自然上限。
与各种协议和应用程序的兼容性
最后,JSON Web密钥集标准与各种协议和应用程序兼容。这意味着它可以在Web应用程序、API、移动应用程序等上下文中实现本地令牌验证。流行的身份验证协议(如OAuth 2.0和OpenID Connect)支持JSON Web密钥集。
最佳实践与安全考虑
处理加密密钥(主要是私钥)是一项高度敏感的任务。在处理JSON Web令牌(JWT)和JSON Web签名(JWS)时,还必须考虑与任何加密应用程序相关的安全问题。正确实施JSON Web密钥集(JWKS)对于确保整个基础架构的安全性和完整性至关重要。以下是一些实施JWKS的最佳实践。
使用传输层安全性
通过HTTP提供JSON Web密钥会带来重大安全风险,因为它可能在传输过程中被拦截或修改。因此,在提供JWKS时使用HTTPS至关重要。HTTPS确保客户端和服务器之间的所有通信都被加密,防止未经授权的访问或传输中的修改。
确保JWKS正确且最新
整个系统的安全性依赖于拥有最新且准确的JWKS。如果集合中的任何加密密钥过期或失效,可能导致令牌被拒绝,或者更糟的是,在整个系统中使用被接受但欺诈的令牌。必须建立流程来定期监控和更新JSON Web密钥。这包括轮换密钥、移除EOL密钥以及在必要时添加新密钥。加密密钥管理应自动化,以确保所有加密密钥始终是最新的。对称密钥不得暴露!
使用JWKS验证传入JWT的签名
实施JWKS的主要目的之一是验证传入JWT(无论是访问令牌还是ID令牌)的真实性。为此,所有基于JSON Web令牌执行授权决策的应用程序都应按照相应的缓存控制头获取整个JSON Web密钥集。
验证JWT首先从其头部获取kid(密钥ID)参数。此密钥标识符指定授权服务器使用JWKS中的哪个加密密钥对令牌进行签名。然后可以使用识别的密钥通过将其与令牌签名中包含的签名进行比较来验证签名。
如果签名有效,则令牌由受信任方颁发,可以相应处理。无效令牌必须立即被拒绝。
考虑定期轮换JWKS密钥
定期轮换JSON Web密钥是维持适当安全态势的基本最佳实践。这样做可以降低受损密钥在整个系统中被恶意使用的风险。有效轮换密钥需要在退役任何旧密钥之前创建新密钥集。这将确保在过渡期间覆盖范围没有空白。
结论:使用JSON Web密钥集的重要性
对于利用去中心化身份验证协议(如OpenID Connect)或授权委托协议(如普通OAuth2)的组织来说,实施JSON Web密钥集(JWKS)至关重要。真正从公钥密码学中受益需要客户端应用程序在本地验证颁发的令牌,而无需不可或缺的同步HTTP请求。
使用基于JavaScript对象表示法(JSON)的数据交换格式(如JSON Web密钥(JWK)),并将加密密钥托管在可公开访问的标准化发现端点上,允许维护解耦的服务架构,同时按照拉取原则将工作转移到客户端。