View a markdown version of this page

使用应用程序负载均衡器验证 JWT - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用应用程序负载均衡器验证 JWT

您可以配置应用程序负载均衡器 (ALB) 来验证客户端为安全服务对服务 (S2S) 或机器对机器 (M2M) 通信提供的 JSON 网络令牌 (JWT)。不管 JWT 是如何发布的,负载均衡器都可以对其进行验证,无需人为干预。

ALB 将验证代币签名并要求两项强制性声明:“iss”(发行者)和 “exp”(到期)。此外,如果代币中存在,ALB还将验证 “nbf”(不是之前)和 “iat”(当时发出)索赔。您最多可以配置 10 个额外的索赔进行验证。这些索赔支持三种格式:

  • Single-string: 单个文本值

  • Space-separated 值:由空格分隔的多个值(最多 10 个值)

  • String-array: 文本值数组(最多 10 个值)

如果令牌有效,则负载均衡器将带有令牌的请求按原样转发给目标。否则,服务将拒绝该请求。

准备使用 JWT 验证

完成以下任务:

  1. 向 IdP 注册您的服务,IdP 会颁发客户端 ID 和客户端密钥。

  2. 单独调用 IdP 以请求访问服务。IdP 使用访问令牌进行响应。该令牌通常是由 IdP 签名的 JWT。

  3. 设置 JSON Web 密钥集 (JWKS) 端点。负载均衡器在您配置的已知位置获取 IdP 发布的公钥。

  4. 将 JWT 包含在请求标头中,并在每个请求中将其转发到应用程序负载均衡器。注意:仅支持 RS256 算法

JWT 验证限制

在应用程序负载均衡器中使用 JWT 验证时,JWKS(JSON Web 密钥集)端点必须满足以下要求:

  • 最大响应大小:150 KB

  • 最大密钥数:10 个密钥

如果您的身份提供商的 JWKS 响应超出其中一个限制,则应用程序负载均衡器不会将请求转发到您的后端目标。

如果您的身份提供商的 JWKS 端点超过这些限制,请考虑在应用程序代码中实现 JWT 验证,或使用密钥集较小的身份提供商。

使用控制台配置 JWT 验证

  1. 在以下位置打开亚马逊 EC2 控制台控制台https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。

  3. 选择您的应用程序负载均衡器,然后选择监听器选项卡。

  4. 选择 HTTPS 侦听器,然后选择管理规则

  5. 选择添加规则

  6. (可选)要为规则指定名称,请展开名称和标签,然后输入名称。要添加其他标签,请选择添加其他标签,然后输入标签键和标签值。

  7. 在 “条件” 下,定义 1-5 个条件值

  8. (可选)要添加转换,请选择添加转换,选择转换类型,然后输入要匹配的正则表达式和替换字符串。

  9. 在 “操作、 Pre-routing操作” 中,选择 “验证令牌”。

    1. 对于 JWKS 终端节点,输入您的 JSON Web 密钥集终端节点的 URL。此端点必须可公开访问,并返回用于验证 JWT 签名的公钥。

    2. 对于发行者,在您的 JWT 代币中输入 iss 索赔的预期价值。

    3. (可选)要验证其他索赔,请选择其他索赔。

      1. 在 “索赔名称” 中,输入要验证的索赔名称。

      2. 对于格式,选择索赔值的解释方式:

        1. 单一字符串:声明必须完全匹配一个指定值。

        2. 字符串数组:声明必须与数组中的一个值相匹配。

        3. 空格分隔的值:该声明包含以空格分隔的值,这些值必须包含指定的值。

      3. 在 “值” 中,输入索赔的预期值。

      4. 对于其他索赔,请重复此操作(最多 10 项索赔)。

  10. 对于操作、路由操作,选择在成功验证令牌后应执行的主要操作(转发至、重定向到或返回固定响应)

  11. 根据需要配置主要操作

  12. 选择保存

使用 CLI 配置 JWT 验证

使用以下 create-rule 命令配置 JWT 验证。

使用验证 JWT 的操作创建监听器规则。监听器必须是 HTTPS 监听器。

注意

配置 JWT 验证时,请确保您的 JWKS 终端节点响应的大小不超过 150 KB 或包含超过 10 个密钥。超过这些限制的响应将阻止将请求转发到您的目标。

aws elbv2 create-rule \ --listener-arn listener-arn \ --priority 10 \ --conditions Field=path-pattern,Values="/login" \ --actions file://actions.json

以下是指定jwt-validation动作和操作的actions.json文件示例。forward请按照您的身份提供商提供的文档确定支持的字段

--actions '[ { "Type":"jwt-validation", "JwtValidationConfig":{ "JwksEndpoint":"https://issuer.example.com/.well-known/jwks.json", "Issuer":"https://issuer.com" }, "Order":1 }, { "Type":"forward", "TargetGroupArn":"target-group-arn", "Order":2 } ]'

以下示例指定了要验证的额外索赔。

--actions '[ { "Type":"jwt-validation", "JwtValidationConfig":{ "JwksEndpoint":"https://issuer.example.com/.well-known/jwks.json", "Issuer":"https://issuer.com", "AdditionalClaims":[ { "Format":"string-array", "Name":"claim_name", "Values":["value1","value2"] } ], }, "Order":1 }, { "Type":"forward", "TargetGroupArn":"target-group-arn", "Order":2 } ]'

有关更多信息,请参阅 Application Load Balancer 的侦听器规则