跳至主内容
版本:4.2

OAuth 2 故障排除

概述

本指南介绍了使用 OAuth 2.0管理插件 时最常见的错误以及如何诊断它们。

故障排除客户端连接

最大 JWT 令牌长度限制

重现步骤

当客户端连接到一个配置为使用 JWT 令牌进行身份验证和授权的节点时,可能会遇到最大消息协议帧限制异常。

故障排除

JWT 令牌的长度可能因编码内容而异。RabbitMQ 支持的消息协议对最大帧长度有实际限制。

默认值通常远高于实际可能的 JWT 令牌长度。例如,对于 AMQP 0-9-1 和 RabbitMQ Stream 协议,默认值为 128 kB。但是,可以通过 rabbitmq.conf 和客户端库配置覆盖最大帧限制。

如果客户端提供了长令牌且配置的限制较低,则连接将被拒绝,并在 服务器日志 中出现“帧长度超出”、“帧过大”等错误消息。

例如,对于 AMQP 0-9-1,情况如下:

2025-03-15 05:55:21.689185+00:00 [info] <0.2771.0> accepting AMQP connection <0.2771.0> (10.8.121.164:45024 -> 10.8.121.141:5672)
2025-03-15 05:55:24.745906+00:00 [error] <0.2771.0> closing AMQP connection <0.2771.0> (10.8.121.164:45024 -> 10.8.121.141:5672):
2025-03-15 05:55:24.745906+00:00 [error] <0.2771.0> {handshake_error,starting,0,
2025-03-15 05:55:24.745906+00:00 [error] <0.2771.0> {amqp_error,frame_error,
2025-03-15 05:55:24.745906+00:00 [error] <0.2771.0> "type 1, all octets = <<>>: {frame_too_large,6307,4088}",
2025-03-15 05:55:24.745906+00:00 [error] <0.2771.0> none}}

有两种可用解决方案:

  1. 增加 rabbitmq.conf 中的 initial_frame_max 值,或 advanced.config 中的 rabbit.initial_frame_max
  2. 减小令牌内容大小,例如,通过删除 RabbitMQ 未使用的某些作用域或对其进行优化(简化)。

增加初始帧大小限制

以下 rabbitmq.conf 示例将初始帧大小限制从默认的 4096 字节增加到 8192 字节。

initial_frame_max = 8192

使用 advanced.config 的相同示例

[
{rabbit, [
{initial_frame_max, 8192}
]}
].

减小 JWT 令牌负载大小

通常可以通过删除 RabbitMQ 未使用的某些作用域来减小 JWT 令牌大小。或者,可以生成一个新的 JWT 令牌,其中包含一组更少的作用域,从而减小其大小。

管理 UI 中 OAuth 2.0 的故障排除

OpenID 发现端点不可达

重现步骤

在浏览器中打开管理 UI 的根 URL。您会看到以下错误消息,而不是“单击此处登录”按钮。

OAuth resource [rabbitmq] not available. OpenId Discovery endpoint https://<the_issuer_url>/.well-known/openid-configuration not reachable

故障排除

这些是导致此问题的最常见原因:

  • 端点不可达,例如,防火墙阻止访问或目标服务已关闭。
  • 端点的 TLS 证书不受浏览器信任。
  • 浏览器因 CORS 策略而阻止访问。

确定根本原因的最快方法是打开浏览器的 JavaScript 控制台并搜索 net::ERR_。最可能的错误是:

  • net::ERR_CONNECTION_REFUSED:端点已关闭或不可达。
  • net::ERR_CERT_AUTHORITY_INVALID:端点的 TLS 证书不受浏览器信任。要信任此证书,请单击错误消息中的 URL 并按照提示操作。

如果没有错误与 net::ERR 匹配,请搜索 CORS。如果出现类似以下内容的错误:

Access to fetch at 'https://<the_issuer_url>>/.well-known/openid-configuration' from origin
'<rabbitmq_url_to_management_ui>' has been blocked by CORS policy

那么浏览器正在阻止端点返回的响应,因此该响应未传递给管理 UI。这是由于 CORS 策略。请要求身份提供商的管理员将管理 UI 的 URL 添加到允许的列表中。

OpenID 发现端点不合规

重现步骤

在浏览器中打开管理 UI 的根 URL。您会看到以下错误消息,而不是“单击此处登录”按钮。

OAuth resource [rabbitmq] not available. OpenId Discovery endpoint https://<the_issuer_url>/.well-known/openid-configuration not compliant

故障排除

当端点返回的 JSON 负载与 OpenID Connect Discovery Configuration 不匹配时,会发生此问题。可能的原因如下:

  • 端点返回的负载不合规,因为它为空或缺少一些关键信息。要确定根本原因,请打开浏览器的 JavaScript 控制台并搜索以下可能错误消息之一:
    • Payload does not contain openid configuration 当负载为空或不是 JSON 负载时,会出现此错误。
    • Missing authorization_endpoint 当缺少 JSON 属性 authorization_endpoint 时,会出现此错误。
    • Missing token_endpoint 当缺少 JSON 属性 token_endpoint 时,会出现此错误。
    • Missing jwks_uri 当缺少 JSON 属性 jwks_uri 时,会出现此错误。
  • URL 错误。请从您的身份提供商管理员那里获取正确的 OpenID Connect Discovery 端点 URL。

未授权

重现步骤

在浏览器中打开管理 UI 的根 URL。单击“单击此处登录”按钮,然后输入身份提供商要求的凭据。

您会被重定向回管理 UI,并显示以下错误:

Not authorized

故障排除

当令牌的作用域或权限不足以访问管理 UI 时,会出现此问题。您至少需要以下作用域之一或等效作用域:

  • rabbitmq.tag:administrator.
  • rabbitmq.tag:management.
  • rabbitmq.tag:monitoring.
  • rabbitmq.tag:policymaker.

请按照以下步骤找出令牌中包含哪些作用域或权限:

  1. 打开浏览器的开发者工具(例如,在 Chrome 或 Firefox 中,右键单击页面并选择“检查”菜单选项)。
  2. 转到“应用程序”选项卡。
  3. 在左侧面板中选择“存储”>“本地存储”选项。
  4. 单击与管理 UI URL 匹配的树选项。
  5. 在右侧面板中选择键 rabbitmq.credentials
  6. 复制其值。
  7. 导航到 https://jwt.net.cn
  8. 将值粘贴到“已编码”文本字段中。
  9. 查看“已解码”文本字段中的负载。
  10. 搜索令牌属性 scope 或配置的 auth_oauth2.additional_scopes_key 的值(如果存在)。
  11. 找到适当的令牌范围属性后,在属性值中查找上面列出的任何范围。如果使用了 auth_oauth2.scope_prefix,则必须将其考虑在内:范围将命名为 myprefix_tag:administrator。如果使用了 范围别名,请查找映射到上述范围之一的范围别名。

OpenID 发现端点因证书无效而无法访问

此问题不一定仅限于管理 UI,当应用程序通过消息协议进行身份验证时也可能发生。当 RabbitMQ 需要通过 auth_oauth2.issuer 中配置的 URL 下载 OpenID Connect 配置时,以及颁发者使用的证书是通配符证书时,就会发生此问题。这意味着证书的 CN 属性与颁发者的域名不完全匹配。这在 SaaS 部署中非常常见。

重现步骤

  1. 在浏览器中打开管理 UI 的根 URL。
  2. 单击“单击此处登录”。
  3. 输入您的凭据。
  4. 您会被重定向回 RabbitMQ,但会收到“未授权”错误。

故障排除

  1. 访问 RabbitMQ 日志。
  2. 查找 {bad_cert,hostname_check_failed}
  3. 如果找到该条目,则表示 RabbitMQ 尝试联系 auth_oauth2.issuer 中找到的 URL,并且颁发者提供了一个通配符证书。
  4. 要解决此问题,请将以下行添加到 rabbitmq.confauth_oauth2.https.hostname_verification = wildcard,或者如果使用多个身份提供商,则为 auth_oauth2.oauth_providers.<my_oauth_provider_name>.https.hostname_verification = wildcard
© . This site is unofficial and not affiliated with VMware.