知识卡片

用户请求认证靠JWKS密钥集合支持非对称签名的分布式验证

普通读书笔记卡

内容

对来自最终用户的请求认证,Istio能做到完全无须应用程序参与——请求进入 服务网格时,Istio直接根据配置的JWKS验证JWT令牌的签名是否合法、是否 在有效期内,通过后就信任负载中的身份,从Iss字段取出Principal。这里的 关键是JWKS(JSON Web Key Set,一组JWK的集合):分布式系统里JWT必须用 非对称签名算法(如RSA SHA256),认证服务器用私钥签名、资源服务器用 公钥验证——这与单体应用里常用默认的HMAC SHA256对称算法不同,因为对称 算法要求验证方也持有能生成签名的同一把密钥,在多个独立的资源服务器 场景下不安全也不现实。JWKS就是承载这些公钥的标准格式,令牌Header里的 KID(Key ID)字段能让验证方自动从JWKS中匹配出该用哪个公钥来验证——这 意味着即使认证服务器同时维护多把密钥(比如正在做密钥轮换),资源服务器 也不需要额外协调,只需按KID查表即可。实践中不建议直接把JWKS内容写死在 配置里(示例代码这样做只是为了演示),而应该用jwksUri指向一个可远程 拉取的地址,这样密钥轮换时资源服务器能自动拿到最新的公钥集合,不需要 每次都重新分发配置。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第9章"可靠通信"9.2.2节 "认证"(源文件:_epub-src对应OEBPS/Text/chapter110.xhtml) - 结论依据:原文说明分布式系统中JWT应采用非对称签名算法而非默认的 HMAC对称算法,JWKS是存储密钥的JWK集合、支持通过令牌Header的KID自动 匹配验证密钥,并建议生产环境用jwksUri而非直接内嵌JWKS内容,直接支撑 本卡片结论。 - 原始内容:我们知道在分布式系统中,JWT应采用非对称的签名算法(RSA SHA256、ECDSA SHA256等,默认的HMAC SHA256属于对称加密)……JKWS顾名 思义就是一组JWK的集合,支持JKWS的系统,能通过JWT令牌Header中的KID (Key ID)来自动匹配出应该使用哪个JWK来验证签名。