跳到主要内容

配置客户端认证

为消息 VPN 配置的客户端认证方案指定了连接的客户端可以提供哪些凭据,以便事件代理认证该客户端。要使客户端成功认证并获准建立与消息 VPN 的连接,客户端必须提供符合已配置并启用的认证方案要求的预期凭据。

可以为消息 VPN 配置以下一种或多种类型的客户端认证方案:

  • 基本认证

消息 VPN 的默认客户端认证方案;它允许客户端使用有效的客户端名称、客户端用户名和可选密码向事件代理进行认证。

  • 客户端证书认证

也称为相互 TLS(mTLS)认证。此认证方案允许客户端通过来自认可的认证机构(CA)的 X509v3 客户端证书向 Solace PubSub+ 事件代理证明其身份。

  • Kerberos 认证

此认证方案允许客户端使用 GSSAPI(通用安全服务 API)中的 Kerberos 机制来认证其与事件代理的连接。要向 Solace PubSub+ 事件代理认证,客户端必须提供从密钥分发中心(KDC)票据授予服务(TGS)获得的服务票据。KDC 服务托管在外部服务器上。

  • OAuth 认证

此认证方案允许客户端使用 OAuth 机制来认证其与事件代理的连接。要向 Solace PubSub+ 事件代理认证,客户端必须提供从 OAuth 授权服务器获得的有效访问令牌。

连接的客户端通过其会话属性指示要使用的认证方案,并且拥有适当的认证凭据。如果请求的认证方案已在事件代理上的消息 VPN 上启用,事件代理将尝试使用该方案认证客户端。如果请求的认证方案未在消息 VPN 上启用,事件代理将不会尝试认证客户端,并将返回一个连接错误,指示认证方案未启用。

基本认证

基本认证是 Solace PubSub+ 使用的默认客户端认证方案。此认证方案允许客户端通过非传输层安全(TLS)/安全套接字层(SSL)连接连接到消息 VPN,并使用有效的客户端名称、客户端用户名和可选密码向事件代理进行认证。

要为给定消息 VPN 配置客户端连接的基本认证,输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# basic

现在 CLI 处于一个级别,您可以在此执行以下配置任务,用于给定消息 VPN 的基本认证方案:

  • 分配 RADIUS 域字符串
  • 配置认证类型
  • 启用/禁用客户端的基本认证

分配RADIUS域字符串

当您使用 RADIUS 认证类型时,您可以为给定消息 VPN 分配一个 RADIUS 域字符串,以便在传出的 RADIUS 访问请求中将该字符串附加到客户端名称。

要为给定消息 VPN 分配 RADIUS 域字符串,输入以下 CONFIG 命令:

solace(...message-vpn/authentication)# basic
solace(...e-vpn/authentication/basic)# radius-domain <auth-domain>

其中:

<auth-domain> 是要附加到传出 RADIUS 访问请求中用户名的认证域字符串。

此命令的 no 版本,no radius-domain,会移除已配置的 RADIUS 域字符串。

配置认证类型

要配置用于客户端基本认证的认证类型,输入以下 CONFIG 命令:

solace(...message-vpn/authentication)# basic
solace(...e-vpn/authentication/basic)# auth-type {radius <radius-profile> \| ldap <ldap-profile> \| internal \| none}

此命令的 no 版本,no authentication,会将认证参数重置回默认的 RADIUS 认证类型。

auth-type 是要配置的认证类型。它可以是以下之一:

  • none 表示用户自动认证。Solace 不推荐此选项。

  • radius 表示通过指定的 RADIUS 配置文件名,使用配置的远程认证拨入用户服务(RADIUS)服务器认证用户。这是默认认证类型。 要使用 RADIUS 认证类型,必须配置并提供外部 RADIUS 服务器供事件代理使用。(请参阅第三方 RADIUS 服务器文档,了解有关选择主机机器和安装服务器软件的信息。)如果事件代理无法使用 RADIUS 服务器,并且使用此默认认证类型,则不会允许任何用户连接到事件代理。

  • ldap 表示通过指定的 LDAP 配置文件名,使用配置的轻量级目录访问协议(LDAP)服务器认证用户。 要使用 LDAP 认证类型,必须配置并提供外部 LDAP 服务器供事件代理使用。(请参阅第三方 LDAP 服务器文档,了解有关选择主机机器和安装服务器软件的信息。)

  • internal 表示使用本地存储的账户信息认证用户。

每个消息 VPN 中都存在一个名为 default 的单一客户端用户名,并且它被分配给所有客户端。在启用客户端用户的内部认证之前,必须为名为 default 的客户端用户名分配密码。否则,客户端无法成功与事件代理认证。

启用/禁用客户端的基本认证

要启用客户端连接到消息 VPN 的基本认证,输入以下 CONFIG 命令:

solace(...message-vpn/authentication)# basic
solace(...e-vpn/authentication/basic)# no shutdown

要禁用客户端连接到消息 VPN 的基本认证,输入以下 CONFIG 命令:

solace(...message-vpn/authentication)# basic
solace(...e-vpn/authentication/basic)# shutdown

基本认证示例

以下示例显示了设置消息 VPN 的基本认证类型,然后将客户端用户的认证类型设置为 RADIUS 的样本命令序列。

以下示例显示了如何显示当前配置的认证类型。


客户端证书认证

要为连接的客户端实施客户端证书或相互 TLS(mTLS)认证,需要在 Solace PubSub+ 事件代理上进行以下配置:

  • 必须为客户端将要连接的任何消息 VPN 配置并启用客户端证书认证。请参阅配置消息 VPN 的客户端证书参数。
  • 必须配置并启用 TLS/SSL 服务。请参阅发布/接收消息的 TLS/SSL 加密配置。

要配置您的事件代理以启用客户端证书吊销检查,请参阅配置证书颁发机构。

客户端使用客户端证书认证的要求包括设置特定的会话属性和创建安全客户端会话。当使用 Solace 消息 API 时,请参阅创建客户端会话。当使用 Solace JMS 消息 API 时,请参阅建立连接。

配置消息 VPN 的客户端证书参数

您可以为给定消息 VPN 配置以下客户端证书认证参数:

  • 允许 API 提供的用户名
  • 配置最大证书链深度
  • 配置验证证书日期
  • 配置客户端用户名来源
  • 配置客户端证书到消息 VPN 匹配
  • 启用/禁用客户端的客户端证书认证

允许 API 提供的用户名

要通过 Solace PubSub+ 事件代理认证并连接到消息 VPN,连接的客户端必须向 Solace 事件代理提供有效的客户端用户名。默认情况下,当使用客户端证书时,客户端证书主题中的通用名称(CN)用作客户端用户名。或者,您可以配置消息 VPN 使用客户端通过会话属性提供的客户端用户名。在这种情况下,客户端证书仍然用于初始认证,但 API 提供的用户名用于后续授权(即,确定客户端的客户端配置文件、ACL 配置文件和队列所有权)。

  • 必须在消息 VPN 上配置客户端用户名。如果客户端用户名不存在,则使用名为 default 的客户端用户名。有关详细信息,请参阅客户端用户名配置。
  • 对于使用客户端证书认证的 MQTT 和 REST 客户端,不支持使用 allow-api-provided-username 选项。

通常不推荐使用此选项。允许客户端提供的用户名比使用证书中的 CN 提供的安全性低,因为它允许经过认证的用户假设任何客户端用户名,而不是将经过认证的用户限制为特定的客户端用户名。

要使用 API 提供的用户名,而不是客户端证书主题中的通用名称,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# client-certificate
solace(...ication/client-certificate)# allow-api-provided-username

此命令的 no 版本 (no allow-api-provided-username) 使用客户端证书主题中的通用名称。

配置最大证书链深度

客户端证书链的深度是证书链中回溯到受信任的根 CA 的签名 CA 证书的数量。

要设置可接受的客户端证书链的最大深度,请输入以下命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# client-certificate
solace(...ication/client-certificate)# max-certificate-chain-depth <max-depth>

其中:

max-depth 是可接受的客户端证书链的最大深度。有效范围是 0 到 8。默认值为 3。

此命令的 no 版本,no max-certificate-chain-depth,将最大深度重置回默认值。

配置验证证书日期

要启用验证客户端证书中的“生效前”和“生效后”有效期日期,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# client-certificate
solace(...ication/client-certificate)# validate-certificate-date

此命令的 no 版本,no validate-certificate-date,禁用验证客户端证书中的“生效前”和“生效后”有效期日期。当禁用时,即使证书根据证书中的“生效前”和“生效后”有效期日期无效,也会接受该证书。

配置客户端用户名来源

要通过 Solace PubSub+ 事件代理认证并连接到消息 VPN,连接的客户端必须向事件代理提供有效的客户端用户名。默认情况下,当使用客户端证书时,事件代理从证书的主题名称字段中提取第一个 CN 并将其用作客户端用户名。或者,您可以配置消息 VPN 使用以下之一作为客户端用户名的来源:

  • 证书的主题备用名称(SAN)扩展中的 msUPN
  • 证书的主题名称字段中的用户标识符(UID)属性
  • 证书的 SHA-1 指纹

如果您配置 CN、SAN 或 UID 作为用户名来源:

  • 所有当前客户端用户名字符限制都适用。例如,如果客户端证书中的 SAN 或 UID 超过 189 个字符,则视为无效,认证失败。有关详细信息,请参阅客户端用户名配置。
  • 如果启用了 allow-api-provided-username 选项,则 API 提供的用户名优先于 SAN 或 UID。
  • 如果未启用 allow-api-provided-username 选项,则当客户端尝试连接到消息 VPN 且证书中未找到 SAN 或 UID 时,认证失败。
  • 客户端证书中的 SAN 扩展必须通过 otherName 字段携带 Microsoft 通用主体名称(msUPN)。不支持其他身份,例如电子邮件地址、DNS 名称或 IP 地址。
  • 如果有多个带有 msUPN 的 SAN 扩展,则取第一个。

要配置客户端用户名来源,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# client-certificate
solace(...ication/client-certificate)# username-source {certificate-thumbprint \| common-name \| common-name-last \| subject-alternative-name-msupn \| uid \| uid-last}

其中:

certificate-thumbprint 指定在客户端针对给定消息 VPN 进行认证时使用证书指纹作为客户端用户名。证书指纹是事件代理在接收到客户端证书后计算的整个 DER 编码证书的 SHA-1 哈希。

common-name 指定在客户端针对给定消息 VPN 进行认证时使用客户端证书中的第一个 CN 实例作为客户端用户名。这是默认设置。

common-name-last 指定在客户端针对给定消息 VPN 进行认证时使用客户端证书中的最后一个 CN 实例作为客户端用户名。

subject-alternative-name-msupn 指定在客户端针对给定消息 VPN 进行认证时使用客户端证书的 SAN 扩展中的 msUPN(在 otherName 字段中)作为客户端用户名。

uid 指定在客户端针对给定消息 VPN 进行认证时使用客户端证书中的第一个用户标识符(UID)属性实例作为客户端用户名。

uid-last 指定在客户端针对给定消息 VPN 进行认证时使用客户端证书中的最后一个 UID 属性实例作为客户端用户名。

此命令的 no 版本,no user-name source,将事件代理重置回默认设置。

配置客户端证书到消息 VPN 匹配

默认情况下,当客户端尝试使用客户端证书登录消息 VPN 时,客户端的用户名从证书中提取(CN、UID、msUPN 或证书指纹),可用于后续的客户端授权。

如果您的部署无法保证从证书中提取的用户名在所有配置在代理上的 CA 颁发的证书中是唯一的,您可能需要配置客户端证书到消息 VPN 匹配,以限制可以作为消息 VPN 中凭证使用的证书类型。

客户端证书到消息 VPN 匹配的一些用例包括:

  • 按证书颁发机构隔离消息 VPN

  • 验证组织单位主题属性

  • 将客户端用户名链接到特定证书

当您配置客户端证书匹配时,您为每个消息 VPN 创建一组匹配规则。要使客户端证书被接受为有效凭证,证书必须至少匹配一条规则。每条规则包含一组一个或多个条件,所有条件都必须满足,证书才能匹配该规则。每个条件将证书字段与客户端用户名(基于用户名来源从证书中提取)关联的属性或固定的通配符表达式进行比较。如果使用属性,它将存储在内部用户数据库中(如果您使用内部授权)或在外部 LDAP 数据库中查找(如果您使用 LDAP 授权)。如果使用表达式,则直接与证书字段进行比较(并且可以包含通配符)。

您还可以创建属性过滤器,以确保匹配规则仅适用于具有某些属性值的客户端用户名。例如,如果您希望允许遗留用户无需其他要求即可登录,您可以将现有客户端用户名标记为 legacy(通过创建用户名属性),然后创建一个包含属性过滤器的规则,该过滤器检查 legacy 属性的值是否设置为 true 而无需任何条件。配置完成后,您可以为新用户向规则添加自定义条件。

要创建证书匹配规则,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# client-certificate
solace(...ication/client-certificate)# matching-rules
solace(...certificate/matching-rules)# create rule <name>

要创建证书匹配规则条件,请输入以下 CONFIG 命令:

solace(...certificate/matching-rules/rule)# create condition {certificate-thumbprint | common-name | common-name-last | subject-alternative-name-msupn | uid | uid-last | org-unit | org-unit-last | issuer | subject | serial-number | dns-name | ip-address} {{matches-attribute <attribute>} | {matches-expression <expression>}}

要创建证书匹配规则属性过滤器,请输入以下 CONFIG 命令:

solace(...certificate/matching-rules/rule)# create attribute-filter <name>
solace(...certificate/matching-rules/rule/attribute-filter)# attribute <value>
solace(...certificate/matching-rules/rule/attribute-filter)# value <value>

修改客户端证书匹配规则不会对现有连接产生任何影响。只有新连接会受到影响。

要启用证书匹配规则,请输入以下 CONFIG 命令:

solace(...certificate/matching-rules/rule)# no shutdown

默认情况下,客户端证书匹配处于禁用状态,任何其他有效的证书都会被接受。要启用客户端证书匹配,请输入以下 CONFIG 命令:

solace(...certificate/matching-rules)# no shutdown

其中:

rule <name> 指定证书匹配规则的名称。

certificate-thumbprint 将证书指纹与指定的属性或通配符表达式进行比较。证书指纹是事件代理在接收到客户端证书后计算的整个 DER 编码证书的 SHA-1 哈希。

common-name 将客户端证书中的第一个 CN 实例与指定的属性或通配符表达式进行比较。

common-name-last 将客户端证书中的最后一个 CN 实例与指定的属性或通配符表达式进行比较。

subject-alternative-name-msupn 将客户端证书的 SAN 扩展中的 msUPN(在 otherName 字段中)与指定的属性或通配符表达式进行比较。

uid 将客户端证书中的第一个用户标识符(UID)属性实例与指定的属性或通配符表达式进行比较。

uid-last 将客户端证书中的最后一个 UID 属性实例与指定的属性或通配符表达式进行比较。

org-unit 将客户端证书中的第一个组织单位属性实例与指定的属性或通配符表达式进行比较。

org-unit-last 将客户端证书中的最后一个组织单位属性实例与指定的属性或通配符表达式进行比较。

issuer 将客户端证书中的颁发者属性与指定的属性或通配符表达式进行比较。

subject 将客户端证书中的主题属性与指定的属性或通配符表达式进行比较。

serial-number 将客户端证书的序列号与指定的属性或通配符表达式进行比较。

dns-name 将客户端证书的 SAN 扩展中的 DNS 名称与指定的属性或通配符表达式进行比较。

ip-address 将客户端证书的 SAN 扩展中的 IP 地址与指定的属性或通配符表达式进行比较。

matches-attribute <attribute> 指定用于比较的属性。

matches-expression <expression> 指定用于比较的通配符表达式。该表达式直接与从证书中提取的字段进行比较,并且可以包含通配符。

attribute-filter <name> 指定属性过滤器的名称。

attribute <value> 指定要测试的属性名称。

value <value> 指定属性的预期值,以便应用证书匹配规则。

用户名属性存储在内部用户数据库中,当使用内部授权时,或转换为 LDAP 搜索过滤器,当使用 LDAP 授权时。属性必须完全匹配,并且通配符字符被视为文字。

示例:

按证书颁发机构隔离消息 VPN

目前,CA 列表是全局事件代理设置。因为特定主题 CN 可能在所有 CA 中不是唯一的,将消息 VPN 限制为特定 CA 可以帮助确保只信任适当的 CA 并且主题 CN 是唯一的。

您可以通过创建一个匹配规则并包含一个条件来比较证书颁发者与通配符表达式来实现这一点。

solace(configure/message-vpn/authentication/client-certificate/matching-rules)# create rule issuer
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# create condition issuer matches-expression "C = CA, ST = Ontario, L = Kanata, O = Solace Systems, OU = IT, CN = *.messaging.solace"
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# no shutdown
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# exit
solace(configure/message-vpn/authentication/client-certificate/matching-rules)# no shutdown

在此示例中,创建了一个名为 issuer 的规则。事件代理将尝试通过比较证书的颁发者与表达式 C = CA, ST = Ontario, L = Kanata, O = Solace Systems, OU = IT, CN = *.messaging.solace 来匹配客户端证书到此规则(此规则包含一个条件)。如果证书的颁发者与表达式匹配,则认为该规则匹配。

验证组织单位主题属性

一些组织要求管理员在证书的主题中的 OU 字段上签字。

您可以通过创建一个匹配规则并包含一个条件来比较证书主题 OU 与 ou 客户端用户名属性来实现这一点。

solace(configure/message-vpn/authentication/client-certificate/matching-rules)# create rule org-unit
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# create condition org-unit matches-attribute ou
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# no shutdown
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# exit
solace(configure/message-vpn/authentication/client-certificate/matching-rules)# no shutdown

这需要您还在客户端用户名上创建适当的属性,有关详细信息,请参阅设置客户端用户名属性。

solace(configure)# client-username App1 message-vpn vpn1
solace(configure/client-username)# create attribute ou Unit1

一旦配置完成,匹配的证书可以具有如下主题:CN=App1, OU=Unit1, O=Org, C=US

在此示例中,创建了一个名为 org-unit 的规则。事件代理将尝试通过比较证书的组织单位(OU)与针对用户名配置的属性来匹配客户端证书到此规则。从证书中提取的用户名(App1)有一个名为 ou 的属性,其值配置为 Unit1。要满足条件(并且由于只有一个条件,因此匹配该规则),从证书中提取的 OU 必须与针对用户名查找的 ou 属性的值完全匹配。

将客户端用户名链接到特定证书

最安全的选项之一是仅允许特定证书(或两个,以便于证书轮换)用于认证给定用户。

您可以通过创建一个匹配规则并包含一个条件来比较证书指纹与 certificateThumbprint 客户端用户名属性来实现这一点。

solace(configure/message-vpn/authentication/client-certificate/matching-rules)# create rule thumbprint
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# create condition certificate-thumbprint matches-attribute certificateThumbprint
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# no shutdown
solace(configure/message-vpn/authentication/client-certificate/matching-rules/rule)# exit
solace(configure/message-vpn/authentication/client-certificate/matching-rules)# no shutdown

这需要您还在客户端用户名上创建适当的属性,有关详细信息,请参阅设置客户端用户名属性。

solace(configure/client-username)# create attribute certificateThumbprint ea:13:85:ca:a9:d0:91:a6:e4:b3:4b:80:4c:08:bb:cb:34:88:8b:dc
solace(configure/client-username)# create attribute certificateThumbprint 06:d7:82:da:12:6a:11:8b:e7:29:84:8d:60:4c:40:27:a4:54:44:3c

在此示例中,创建了一个名为 thumbprint 的规则。事件代理将尝试通过比较从证书计算出的指纹与针对用户名配置的属性来匹配客户端证书到此规则。在这种情况下,客户端用户名针对它配置了两个 certificateThumbprint 属性,以便于证书轮换。要满足条件,从证书计算出的指纹必须与针对用户名的 certificateThumbprint 属性之一的值完全匹配。

或者,您可以创建一个包含两个条件的规则,一个用于检查证书颁发者是否正确(请参阅按证书颁发机构隔离消息 VPN),另一个用于比较证书序列号与 certificateSerialNumber 客户端用户名属性。这一对值唯一标识一个证书。

因为客户端用户名属性可以有多个值,这允许在证书重新签发时平稳过渡。您可以添加一个新的指纹或序列号,然后在之后移除旧的一个,因此客户端将能够在任何时间使用旧证书或新证书重新连接。

启用/禁用客户端的客户端证书认证

要启用客户端连接到给定消息 VPN 的客户端证书认证,请输入以下 CONFIG 命令:

solace(...ication/client-certificate)# no shutdown

要禁用客户端连接到给定消息 VPN 的客户端证书认证,请输入以下 CONFIG 命令:

solace(...ication/client-certificate)# shutdown

Kerberos认证

要为连接到 Solace PubSub+ 事件代理的客户端实施 Kerberos 认证,需要在事件代理上进行以下配置:

  1. 必须在事件代理上加载 Kerberos 密钥表。请参阅事件代理文件管理。
  2. 必须为 Kerberos 认证客户端将要连接的任何消息 VPN 配置并启用 Kerberos 认证。请参阅启用/禁用 Kerberos 客户端认证。
  3. 可选:在设备上,可以将 Kerberos 服务主体名称(SPN)分配给消息骨干 VRF 的 IP 地址,Kerberos 认证客户端将使用该地址。请参阅配置 Kerberos 服务主体名称配置选项中的配置管理接口和消息骨干接口。
  • 客户端端 API 要求客户端使用 Kerberos 认证包括使用适当的 Java 发行版或为使用的消息 API 安装的 Kerberos 库(请参阅 Solace 企业 API 的快速入门或 Solace JMS API 的快速入门)。客户端应用程序还必须为相应的会话设置认证方案为 Kerberos(请参阅 Solace 消息 API 的创建客户端会话或 Solace JMS API 的建立连接)。Kerberos 认证不适用于 Solace Web 消息 API。
  • Kerberos 认证不支持 MQTT 客户端。

配置同步不会自动同步本节讨论的对象或属性。因此,如果事件代理以高可用性(HA)对或在复制站点中使用,您必须在每个配对事件代理或复制消息 VPN 上手动配置这些对象/属性。

要确定对象/属性是否由配置同步同步,请在 CLI 命令参考中查找用于配置对象/属性的命令,或在 Solace CLI 中输入该命令,并以 "?" 结尾。帮助将列出对象/属性是否被同步。

管理Kerberos密钥表

为了便于 Kerberos 认证,必须将适当的密钥表条目添加到事件代理的 /keytab 目录中。典型部署将至少使用三个密钥表条目——一个用于事件代理的每个虚拟 IP 地址,一个用于事件代理的物理 IP 地址(例如,solace/primary-virtual-router-dnsname@REALMsolace/backup-virtual-router-dnsname@REALMsolace/physical-router-dnsname@REALM 的密钥)。对于某些部署,可能需要额外的密钥表条目(例如,对于未将以太网接口组合成 LAG 的部署,每个接口都有自己的 IP 地址和 DNS 名称集)。

添加密钥表条目

要将位于事件代理的 /keytab 目录中的 .keytab 文件中的密钥添加到事件代理的注册密钥中,请输入以下 CONFIG 命令:

solace(configure)# authentication kerberos keytab
solace(configure/authentication/kerberos/keytab)# add-keytab <keytab-filename> <index>

其中:

<keytab-filename> 是密钥表文件的文件名。此密钥表文件必须位于事件代理的 /keytab 目录中,并且它必须至少具有读取权限。注意,如果密钥表文件是使用 Solace 文件传输用户帐户传输到事件代理的,那么文件应该具有正确的权限。

<index> 是要安装的密钥表文件中的密钥索引。如果未指定索引,则事件代理取第一个密钥。

  • 在设备上,可以为 VRF 接口配置特定的服务主体名称(SPN)值。当为接口分配 SPN 值时,连接到该接口的客户端必须提供一个服务密钥,该密钥与 Solace PubSub+ 事件代理密钥表中的密钥匹配,并且具有匹配的 SPN 和密钥版本号(KVNO)。
  • 当未为接口分配 SPN 值时,客户端可以通过该接口使用任何 SPN 值进行连接,只要客户端的服务密钥与 Solace PubSub+ 事件代理密钥表中的密钥匹配即可。
  • 建议您使用唯一的密码为多个 Solace PubSub+ 事件代理生成服务密钥。
  • 如果您使用 RC4 加密,用于生成密钥的密码不会与提供的 SPN 值一起加盐。如果您使用相同的密码为多个 Solace PubSub+ 事件代理生成服务密钥,那么客户端可能能够连接到使用相同密码生成服务密钥的任何事件代理,即使这些事件代理具有不同的 SPN。
  • 如果您使用 AES 加密生成服务密钥,用于生成服务密钥的密码会与提供的 SPN 值一起加盐。因此,使用相同密码但使用不同的 SPN 值会生成唯一的密钥。

删除密钥表条目

要从事件代理的密钥表中删除 Kerberos 密钥,请输入以下 CONFIG 命令:

solace(configure)# authentication kerberos keytab
solace(configure/authentication/kerberos/keytab)# delete-keytab-entry <index>

其中:

<index> 是事件代理的密钥表存储中的密钥索引。

显示Kerberos密钥表信息

要显示安装在 Solace PubSub+ 事件代理上的 Kerberos 密钥,包括密钥表中的密钥总数,以及任何映射到消息骨干 VRF 的 SPN 值,请输入以下 User EXEC 命令:

show> kerberos \[{keytab \| keytab-file <file-name>} \[detail\]\]

其中:

keytab 指定显示安装在事件代理的内部密钥表存储上的 Kerberos 密钥。

keytab-file <file-name> 指定显示事件代理的 /keytab 目录中指定密钥表文件中的 Kerberos 密钥。允许使用通配符作为文件名,以指定多个文件名。

detail 指定显示每个密钥表条目的详细信息。

允许API提供的用户名

认证的客户端必须向 Solace PubSub+ 事件代理提供有效的客户端用户名。默认情况下,当使用 Kerberos 认证时,Kerberos 令牌中的 Kerberos 用户主体名称用作客户端用户名。或者,消息 VPN 可以配置为使用客户端通过建立客户端连接的会话属性提供的客户端用户名。在这种情况下,客户端 Kerberos 令牌仍然用于初始认证,但 API 提供的用户名用于后续授权(即,确定客户端的客户端用户名)。

当未启用 allow-api-provided-username 选项时,如果客户端的 Kerberos 用户主体名称与在消息 VPN 上配置的客户端用户名不匹配,则使用 default 用户名。因此,当未启用 allow-api-provided-username 选项时,请确保您配置的客户端用户名与使用的 Kerberos 用户主体匹配,并且 default 用户名已关闭。

要启用 API 提供的用户名而不是 Kerberos 令牌中的 Kerberos 主体名称,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# kerberos
solace(...pn/authentication/kerberos)# allow-api-provided-username

此命令的 no 版本,no allow-api-provided-username,禁用此选项,以便使用客户端令牌中的 Kerberos 用户主体名称作为授权的“用户名”。

如果使用 allow-api-provided-username 选项,并且在会话属性中未提供客户端用户名,则将使用消息 VPN 的 default 客户端用户名进行授权。

管理Kerberos域

Kerberos 域是 Kerberos 有权认证客户端到服务的域,或一组系统。在域内有用户主体(客户端)、服务主体(提供给客户端的资源)和 KDC,它提供票据并授予临时会话密钥,允许客户端认证到服务。

当您在事件代理上创建 Kerberos 域对象时,您提供了配置域到 KDC 地址映射的手段。在启用 Kafka 接收器和发送器使用 Kerberos 认证到远程 Kafka 代理之前,此映射是必需的(请参阅配置 Kafka 接收器的认证方案或配置 Kafka 发送器的认证方案)。

要创建 Kerberos 域,请输入以下 CONFIG 命令:

solace(...e/message-vpn/authentication/kerberos)# create realm <name>

要编辑现有域的属性,请输入以下 CONFIG 命令:

solace(...e/message-vpn/authentication/kerberos)# realm <name>

其中:

<name> 是 Kerberos 域名称。此名称必须以 @ 开头,并且通常全部使用大写字母编写。

此命令的 no 版本,no realm,删除域。

您可以为配置的 Kerberos 域执行以下任务:

  • 配置密钥分发中心地址

  • 启用/禁用 Kerberos 域

  • 显示 Kerberos 域信息

配置密钥分发中心地址

要配置此域中主体的 KDC 的 IP 地址或主机名,请输入以下 CONFIG 命令:

solace(...e/message-vpn/authentication/kerberos)# realm <name>
solace(...age-vpn/authentication/kerberos/realm)# kdc-address <value>

其中:

<value> 是 KDC 的 IP 地址或 FQDN 以及可选端口。

此命令的 no 版本,no kdc-address,移除配置。

启用/禁用Kerberos域

要启用 Kerberos 域,请输入以下 CONFIG 命令:

solace(...e/message-vpn/authentication/kerberos)# realm <name>
solace(...age-vpn/authentication/kerberos/realm)# no shutdown

要禁用域,请输入以下 CONFIG 命令:

solace(...age-vpn/authentication/kerberos/realm)# shutdown

显示 Kerberos 域信息

要显示有关 Kerberos 域的信息,请输入以下 User EXEC 命令:

show message-vpn <vpn-name> kerberos realm <realm>

其中:

<vpn-name> 是配置域的消息 VPN 的名称。

<realm> 是 Kerberos 域的名称。

启用/禁用Kerberos客户端认证

要启用客户端连接到给定消息 VPN 的 Kerberos 认证,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# kerberos
solace(...pn/authentication/kerberos)# no shutdown

要禁用客户端连接到给定消息 VPN 的 Kerberos 认证,请输入以下 CONFIG 命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(...message-vpn/authentication)# kerberos
solace(...pn/authentication/kerberos)# shutdown

OAuth认证

要在消息 VPN 级别为连接到 PubSub+ 事件代理的客户端实施 OAuth 认证,需要进行以下配置:

  • 必须使用 PubSub+ 9.12.1 或更高版本。尽管 OAuth 认证对于 MQTT 客户端在 9.2 版本中引入,但现有的 OAuth 提供商配置已弃用(请参阅与旧版本的兼容性)。如果您的部署使用 OAuth 提供商认证 MQTT 客户端,您必须在弃用期限结束前手动将 OAuth 提供商配置迁移到新的消息 VPN 范围的 OAuth 配置文件。请联系 Solace 获取帮助。
  • 必须通过设置服务器证书配置事件代理使用 TLS。有关详细信息,请参阅管理服务器证书。
  • 必须在事件代理上创建 OAuth 配置文件,并进行以下额外配置(请参阅管理消息 VPN OAuth 配置文件):
    • client-id:在事件代理上配置的客户端 ID 必须与 OAuth 客户端 ID 匹配。
    • client-secret:在事件代理上配置的客户端密钥必须与 OAuth 客户端密钥匹配。
    • endpoints:最佳实践是:配置 discovery 端点并保留其他端点不设置; 保留 discovery 端点不设置并配置其他端点。
  • 必须为 OAuth 认证客户端将要连接的任何消息 VPN 启用 OAuth 认证。请参阅启用 OAuth 客户端认证。

您需要根据要从中获取声明的令牌(id-tokenaccess-token)以及期望从令牌中接收的声明进行额外配置。额外配置将取决于您的具体设置。以下提供了详细的配置信息。

消息 VPN OAuth 配置文件与全局 OAuth 配置文件之间的差异

  • 全局配置文件具有 SEMPv2 访问级别配置,消息 VPN OAuth 配置文件具有 username-claim-nameauthorization-groups-claim-name 用于客户端 ACL。
  • 使用 SEMPv2 时,OAuth 令牌与每个请求一起提供;客户端连接在建立时进行认证,但不是每个消息都进行认证。提供了 disconnect-on-token-expiration 设置,以允许控制令牌到期时是否断开连接。
  • 全局配置文件中与交互式 OAuth 相关的设置在消息 VPN 配置文件中不存在。
  • OAuth for MQTT 具有用户名验证设置。用户名始终从 OAuth 确定,但当启用此设置时,如果通过 OAuth 发现的名称与连接建立期间指定的用户名不匹配,则认证失败。此设置以 mqtt-username-validate 配置选项的形式带入消息 VPN OAuth 配置文件(请参阅配置客户端认证)。

管理消息VPN OAuth配置文件

要在消息 VPN 级别为连接到 PubSub+ 事件代理的客户端实施 OAuth 认证,您必须首先创建消息 VPN OAuth 配置文件。您可以创建的消息 VPN OAuth 配置文件的数量受限于事件代理上的消息 VPN 数量,或 500,以较低者为准。

要创建配置文件,请输入以下命令:

solace(...gure/message-vpn/authentication/oauth)# create profile <profile>
solace(...sage-vpn/authentication/oauth/profile)#

要配置现有配置文件,请输入以下命令:

solace(...gure/message-vpn/authentication/oauth)# profile <profile>

要启用配置文件,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# no shutdown

要指定默认配置文件,请输入以下命令:

solace(...gure/message-vpn/authentication/oauth)# default-profile <profile>

其中:

<profile> 是消息 VPN OAuth 配置文件的名称。

您可以为配置文件配置的设置包括:

  • OAuth 角色
  • 端点
  • 客户端
  • 资源服务器
  • 客户端 ID
  • 配置客户端认证
  • 发行者标识符
  • 令牌到期时断开连接
  • 授权组声明
  • 用户名声明名称
  • 前向代理

OAuth角色

您可以配置事件代理作为 OAuth 客户端或资源服务器。如果您为配置文件配置客户端角色,这意味着配置文件使用 OpenID Connect,并且一旦启用,事件代理期望在客户端尝试认证时接收 ID 令牌。如果您为配置文件配置资源服务器角色,这意味着配置文件使用 OAuth2,并且如果启用,代理期望在客户端认证时接收访问令牌。

默认情况下,事件代理角色设置为 client。如果 oauth-role 设置为 resource-server 并且 client scope 不包含 openid scope,则 oauth-role 不能更改为 client。更改将被拒绝,并且 oauth-role 将保持为 resource-server。必须在 client scope 配置中包含 openid scope,然后才能从 resource-server 角色切换到 client 角色。如果 oauth-role 是客户端,则不使用内省端点,无需配置,并且同样,如果 oauth-roleresource-server,则不会使用 userinfo 端点。

要将事件代理设置为 OAuth 客户端或资源服务器,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# oauth-role \[client \| resource-server\]

此命令的 no 版本,no oauth-role,将事件代理角色设置回默认的 client 角色。

端点

OAuth 端点是您用于进行认证请求的 URL。所有端点必须使用 TLS。任何不以 https://(不区分大小写)开头的端点将在配置时被拒绝。通过发现确定的端点如果在运行时不是 TLS,也将被拒绝。

要配置 OAuth 端点,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# endpoints

从这个级别,您可以配置以下端点设置:

solace(...uthentication/oauth/profile/endpoints)# \[discovery \| discovery-refresh-interval \| introspection \| introspection-timeout \| jwks \| jwks-refresh-interval \| userinfo \| userinfo-timeout\]

发现端点

发现端点是 OpenID Connect 发现端点或 OAuth 2.0 授权服务器元数据端点。通常,这是您需要配置的唯一端点,因为此端点提供有关 OAuth 发行者和所有其他端点的信息。最佳实践是:配置 discovery 端点并保留其他端点不设置; 保留 discovery 端点不设置并配置其他端点。

要配置发现端点,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# discovery <value>

其中:

<value> 是发现 URL。

此命令的 no 版本,no discovery <value>,将端点值重置为 none。

发现刷新间隔

发现刷新间隔用于配置 discovery 端点请求之间的秒数。

要配置发现刷新间隔,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# discovery-refresh-interval <value>

其中:

<value>discovery 端点请求之间的秒数。

此命令的 no 版本,discovery-refresh-interval,将其值重置为默认的 86400 秒(1 天)。

内省端点

令牌内省端点返回与访问令牌标识的用户关联的声明。

要配置内省端点,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# introspection <value>

其中:

<value> 是 OAuth 内省端点的 URI。仅支持 HTTPS。如果您指定 HTTPS 地址,则必须在事件代理上配置证书和证书颁发机构。请参阅管理服务器证书。

此命令的 no 版本,no introspection,将端点值重置为 none。

内省超时

配置的内省超时是允许令牌内省请求发生的最大时间(以秒为单位)。

要配置内省超时,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# introspection-timeout <value>

其中:

<value> 是要设置的秒数。

此命令的 no 版本,no introspection-timeout,将其值重置为 1 秒。

JWKS 端点

为了验证 ID 和访问令牌,事件代理需要访问公钥。这些密钥可以从 OAuth 身份提供者的 JSON Web Key Set (JWKS) 端点获得。此端点可以明确配置,也可以从发现文档中确定。jwks 端点返回用于验证来自 OAuth 身份提供者的 JSON Web Tokens (JWTs) 的密钥。事件代理从该 URL 获取这些密钥以验证令牌签名并缓存

要配置 JWKS 端点,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# jwks <value>

其中:

<value>jwks 端点的 URI。仅支持 HTTPS。如果您指定 HTTPS 地址,则必须在事件代理上配置证书和证书颁发机构。请参阅管理服务器证书。

此命令的 no 版本,no jwks,将端点值重置为 none。

JWKS 刷新间隔

默认情况下,PubSub+ 事件代理每 24 小时刷新一次从 OAuth 授权服务器获得的任何 JWKS 公钥。

密钥也会在以下情况发生时刷新:

  • 刷新间隔更改。
  • JWKS 端点更改。
  • 发行者更改。
  • OAuth 配置文件启用。
  • 消息 VPN 启用,或为消息 VPN 启用 OAuth 认证。
  • 代理重启。

jwks-refresh-interval,事件代理将刷新密钥集。如果事件代理尝试刷新密钥且请求失败,则执行以下重试:

  • 如果缺少有效数据,则每 60 秒无限重试。
  • 如果存在有效数据,则每 60 秒重试三次。然后,事件代理将停止并等待下一次计划刷新或数据过期。

此外,当 JWKS 密钥年龄超过三倍的 jwks-refresh-interval 时,JWKS 密钥将过期。

要配置 JWKS 刷新间隔,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# jwks-refresh-interval <value>

其中:

<value> 是强制公钥刷新之间的秒数。

此命令的 no 版本,no jwks-refresh-interval,将其值重置为默认的 86400 秒(1 天)。

userinfo 端点

userinfo 端点是 OpenID Connect 标准(OIDC)的一部分,旨在返回有关认证用户的信息。在 ID 令牌可能不包含所有所需声明的情况下使用该端点,此时使用访问令牌检索 userinfo。

要配置 userinfo 端点,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# userinfo <value>

其中:

<value> 是 userinfo 端点的 URL。

此命令的 no 版本,no userinfo,将端点值重置为 none。

userinfo 超时

使用 userinfo 超时端点,您可以设置 userinfo 请求允许的最大时间。

要配置 userinfo 超时,请输入以下命令:

solace(...uthentication/oauth/profile/endpoints)# userinfo-timeout <value>

其中:

<value> 是 userinfo 请求允许的秒数。

此命令的 no 版本,no userinfo-timeout,将其值重置为默认值 1 秒。

客户端

客户端是希望访问资源服务器数据的应用程序。它是从授权服务器请求访问令牌或 ID 令牌,然后将其传递给令牌服务器以获取数据访问权限的应用程序。

要配置事件代理上的 OAuth 客户端设置,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# client
solace(...n/authentication/oauth/profile/client)#

从这个级别,您可以配置以下设置:

solace(...n/authentication/oauth/profile/client)# \[required-claim ... \| required-type ... \| validate-type\]

必需声明

您可以在事件代理上配置必需声明以验证 ID 令牌。在 required-claim 下指定的所有声明必须完全匹配。required-claim 的值以 JSON 格式指定,可以是字符串、数字或任意 JSON 对象。每个 OAuth 配置文件最多可以配置四个必需声明。

要创建必需声明,请输入以下命令:

solace(...n/authentication/oauth/profile/client)# create required-claim <name> <value>

其中:

<name> 是要验证的 ID 令牌声明的名称。声明名称必须唯一,并且区分大小写。

<value> 是必需声明的值,必须是包含有效 JSON 值的字符串。

此命令的 no 版本,no required-claim <value>,删除配置的声明。

必需类型

ID 令牌头部所需的内容类型。默认值为 JWT。

要配置必需类型值,请输入以下命令:

solace(...n/authentication/oauth/profile/client)# required-type <value>

其中:

<value> 是要设置的 required-type 的值。

此命令的 no 版本,no required-type <value>,将其值重置为 JWT。

验证类型

validate-type 参数验证令牌 ID 类型。默认情况下,设置为 true。如果 validate-type 为 true,则没有 typ 头部字段的令牌将无法通过验证。通常,大多数 OAuth 身份提供者将 typ 设置为 JWT。此外,如果启用 validate-type(默认),JWT 头部中的 typ 字段必须与 required-type 中配置的值匹配。

要配置验证类型参数,请输入以下命令:

solace(...n/authentication/oauth/profile/client)# validate-type

此命令的 no 版本,no validate,将默认值(true)更改为 false

资源服务器

在 OAuth 流程中,资源服务器接受访问令牌并验证其有效性。resource-server 下的配置仅在 oauth-role 为资源服务器时生效。

要配置 OAuth 资源服务器设置,请输入以下命令:

solace(configure/authentication/oauth-profile)# resource-server
solace(...e/authentication/oauth-profile/resource-server)#

从这个级别,您可以配置以下设置:

solace(...e/authentication/oauth-profile/resource-server)# \[parse-access-token \| required-audience \| required-claim \| required-issuer \| required-scope \| required-type \| validate-audience \| validate-issuer \| validate-scope \| validate-type\]

解析访问令牌

您可以启用或禁用将访问令牌解析为 JWT。默认情况下启用。当 parse-access-token 启用时,访问令牌会被检查以确定它是否包含用于用户名和组的声明。如果它包含这两个声明,则无需进一步处理,并使用适当声明的值。但是,如果提供了内省端点(直接提供或通过发现),即使令牌包含用户名和组,也会检查每个访问令牌。如果禁用 parse-access-token,则必须指定 introspection-endpoint

要禁用默认的 parse-access-token,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# no parse-access-token

必需类型

访问令牌头部所需的内容类型。默认值为 at+jwt

要配置必需类型值,请输入以下命令:

solace(configure/authentication/oauth-profile/client)# required-type <value>

其中:

<value> 是要设置的 required-type 的值。

此命令的 no 版本,no required-type <value>,将其值重置为 at+jwt

必需受众

您可以配置事件代理以验证客户端提供的必需受众参数。必需受众值必须与 aud 声明匹配,如果 aud 声明是字符串,则必须匹配;如果是字符串数组,则必须与 aud 声明的值之一匹配。如果必需受众值不正确,事件代理将拒绝连接尝试。

要配置 OAuth 必需受众值,请输入以下命令:

solace(...e/authentication/oauth-profile/resource-server)# required-audience <value>

此命令的 no 版本,no required-audience <value>,将其值重置为 none。

必需声明

您可以在事件代理上配置必需声明以验证访问令牌或内省响应。在 required-claim 下指定的所有声明必须完全匹配。required-claim 的值以 JSON 格式指定,可以是字符串、数字或任意 JSON 对象。每个 OAuth 配置文件最多可以配置八个必需声明。

要创建必需声明,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# create required-claim <name> <value>

其中:

<name> 是要验证的 id-token 声明的名称。声明名称必须唯一,并且区分大小写。

<value> 是必需声明的值,必须是包含有效 JSON 值的字符串。

此命令的 no 版本,no required-claim <value>,删除配置的声明。

必需发行者

您可以配置事件代理以验证访问令牌或内省响应中的必需发行者声明。配置的 required-issuer 值必须与 iss 声明匹配。如果未指定 required-issuer,则使用 discovery 端点的 issuer 来验证 iss 声明。

要配置必需发行者声明,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# required-issuer <value>

其中:

<value> 是要配置的必需发行者声明的值。

此命令的 no 版本,no required-claim <value>,将其值重置为 none。

必需范围

必需范围是必须存在于 scope 声明中的空格分隔的范围列表。scope 声明必须包含 required-scope 中的所有值,但可以包含其他范围,并且范围可以是不同的顺序。如果 required-scope 为空或未设置,则不执行 scope 验证。

要配置事件代理上的必需范围,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# required-scope <value>

其中:

<value> 是要配置的必需发行者声明的值。

此命令的 no 版本,no required-scope <value>,将其值重置为 none。

验证受众

您可以配置事件代理以验证受众参数以验证访问令牌或内省响应中的 aud 声明。默认情况下启用此功能。如果禁用 validate-audience,则不执行 required-audience 验证。如果启用,则执行 required-audience 中描述的验证。

要配置事件代理以验证受众声明,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# validate-audience

此命令的 no 版本,no validate-audience,禁用它。

验证发行者

您可以配置事件代理以验证发行者参数以验证访问令牌或内省响应中的 iss 声明。默认情况下启用此功能。如果禁用 validate-issuer,则不执行 required-issuer 验证。如果启用,则执行 required-issuer 中描述的验证。

要配置事件代理以验证发行者声明,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# validate-issuer

此命令的 no 版本,no validate-issuer,禁用它。

验证范围

您可以配置事件代理以验证范围参数以验证访问令牌或内省响应中的 scope 声明。默认情况下启用此功能。如果禁用 validate-scope,则不执行 required-scope 验证。如果启用,则执行 required-scope 中描述的验证。

要配置事件代理以验证范围声明,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# validate-scope

此命令的 no 版本,no validate-scope,禁用它。

验证类型

您可以配置事件代理以验证范围参数以验证访问令牌头部中的 typ 字段。默认情况下启用此功能。如果禁用 validate-type,则不执行 required-type 验证。如果启用,则执行 required-type 中描述的验证。

要配置事件代理以验证 typ 字段,请输入以下命令:

solace(configure/authentication/oauth-profile/resource-server)# validate-type

此命令的 no 版本,no validate-type,禁用它。

客户端 ID

当客户端在 OAuth 身份提供者处注册时,它们会收到客户端 ID 以及客户端密钥。这些基本上相当于用户名和密码,授权服务器使用它们来认证应用程序。client-id 识别负责 OAuth 请求的客户端。

如果将事件代理上的 OAuth 角色设置为客户端,则 client-id 会检查收到的 ID 令牌中的 aud 声明。如果将 OAuth 角色设置为资源服务器,则此验证取决于 validate-audience 设置。如果启用 validate-audience,则 client-id 会检查 required-audience 配置中指示的声明。在任何情况下,如果值不正确,事件代理将拒绝连接尝试。

要在您的事件代理上配置客户端 ID,请输入以下命令:

solace(configure/authentication/oauth-profile)# client-id <value>

<value> 是 OAuth 提供的客户端 ID。

此命令的 no 版本,no client-id,将其值重置为 none。

客户端密钥

当客户端在 OAuth 身份提供者处注册时,它们会收到客户端 ID 和客户端密钥。这些基本上相当于用户名和密码,授权服务器使用它们来认证应用程序。客户端密钥仅在您使用内省端点时必要(请参阅内省端点)。

要在您的事件代理上配置客户端密钥,请输入以下命令:

solace(configure/authentication/oauth-profile)# client-secret <value>

<value> 是 OAuth 提供的客户端密钥。

此命令的 no 版本,no client-secret,将其值重置为 none。

MQTT用户名验证

您可以配置事件代理以验证 MQTT 客户端提供的用户名与从令牌中提取的用户名。如果它们不同,则事件代理将拒绝连接尝试。

此设置包含在内是为了向后兼容,以允许将 OAuth 提供商(在 9.12.1 版本中已弃用)转换为消息 VPN OAuth 配置文件。因为它没有安全好处,所以不应在生产环境中使用。

要启用 MQTT 用户名验证,请输入以下命令:

solace(configure/authentication/oauth-profile)# mqtt-username-validate

此命令的 no 版本,no mqtt-username-validate,禁用 MQTT 用户名验证。

发行者标识符

要配置授权服务器的发行者标识符,请输入以下命令:

solace(configure/authentication/oauth-profile)# issuer <value>

其中:

<value> 是授权服务器的发行者标识符 URL。

此命令的 no 版本,no issuer <value>,将其值重置为 none。

令牌到期时断开连接

默认情况下,PubSub+ 事件代理会在客户端的令牌到期时断开客户端连接。您可以更改此默认设置以适应您的部署。更改此值不会影响现有客户端,仅影响新客户端连接。

要配置事件代理在客户端的令牌到期时断开客户端连接,请输入以下命令:

solace(configure/authentication/oauth-profile)# disconnect-on-token-expiration

此命令的 no 版本,no disconnect-on-token-expiration,停止事件代理在客户端的令牌到期时断开客户端连接。

授权组声明

默认情况下,PubSub+ 事件代理使用 OAuth 令牌中的 groups 字段来确定客户端授权组。您可以更改此默认设置以适应您的部署。有关授权组的详细信息,请参阅配置授权组。

要配置授权组声明名称,请输入以下命令:

solace(configure/authentication/oauth-profile)# authorization-groups-claim-name <value>

其中:

<value> 是用于确定客户端授权组的令牌中的字段。如果未提供值,则使用默认的 groups。当使用 JWT 时,声明名称必须位于 JWT 的顶层。换句话说,它们不能嵌入。此外,您要作为客户端授权组使用的任何声明的值必须是字符串或字符串数组。

在此示例中,"authGroupClaim" 字段用于确定授权组,其值是字符串 "abcdefghi"

{
...
"authGroupClaim": "abcdefghi",
...
}

在此示例中,"authGroup" 字段用于确定授权组,其值是字符串数组 ["a b c", "def", "ghi"]。事件代理将此数组解释为三个授权组,"a b c"(包括空格)、"def""ghi"。在这种情况下,客户端将被分配到与提供的名称之一匹配的最高优先级授权组。

{
...
"authGroup": ["a b c", "def", "ghi"],
...
}

此命令的 no 版本,no authorization-groups-claim-name <value>,将其值重置为默认的 groups

为了兼容性,您可以配置事件代理将声明的字符串值解释为以空格分隔的组集,类似于 scope 声明。例如,声明值 "a b c" 将被解释为三个组:"a""b""c"

要配置此行为,请输入以下命令:

solace(configure/authentication/oauth-profile)# authorization-groups-claim-string-format space-delimited

此命令的 no 版本,no authorization-groups-claim-string-format,将其值重置为默认的 single

用户名声明名称

默认情况下,PubSub+ 事件代理使用 OAuth 令牌中的 sub 字段来确定客户端用户名。您可以配置自定义 username-claim-name,它必须是字符串;例如,email。不支持其他类型的声明,如数字、布尔值、对象、数组等。

要配置用户名声明名称,请输入以下命令:

solace(configure/authentication/oauth-profile)# username-claim-name <value>

其中:

<value> 是用于确定客户端用户名的令牌中的字段。如果未提供值,则使用默认的 sub

此命令的 no 版本,no username-claim-name <value>,将其值重置为默认的 sub

前向代理

根据您的部署,您可能需要事件代理与授权服务器之间的通信通过前向代理。如果您的事件代理位于防火墙后面,并且出站流量需要连接到代理服务器以穿越防火墙,通常会出现这种情况。

要为消息 VPN OAuth 配置文件配置前向代理,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# proxy <proxy-name>

其中:

<proxy-name> 是在事件代理上配置的前向代理的名称,用于发现、用户信息和内省请求。有关详细信息,请参阅配置前向代理。

此命令的 no 版本,no proxy,移除任何配置的前向代理。

启用消息VPN OAuth配置文件

要启用消息 VPN OAuth 配置文件,请输入以下命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(configure/message-vpn/authentication)# oauth
solace(...gure/message-vpn/authentication/oauth)# profile <profile>
solace(...sage-vpn/authentication/oauth/profile)# no shutdown

要禁用给定消息 VPN 的客户端的消息 VPN OAuth 配置文件认证,请输入以下命令:

solace(...sage-vpn/authentication/oauth/profile)# shutdown

显示消息VPN OAuth配置文件信息

要显示有关 OAuth 配置文件的信息,请输入以下命令:

show message-vpn <vpn-name> oauth profile <profile> \[client required-claim <required-claim-name-pattern> \| resource-server required-claim <required-claim-name-pattern>\] \| \[detail \[stats\]\]

其中:

<vpn-name> 是配置配置文件的消息 VPN 的名称。

<profile> 是您要监控的 OAuth 配置文件的名称。

client required-claim 显示 ID 令牌中必须存在的声明值。

resource-server required-claim 显示访问令牌中必须存在的声明值。

<required-claim-name-pattern> 是要应用于命令的所需声明名称过滤器;可以包含通配符字符 * 或 ?。

detail 显示 OAuth 配置文件的详细信息。

stats 显示 OAuth 配置文件的统计信息。

启用OAuth客户端认证

要启用客户端连接到给定消息 VPN 的 OAuth 认证,请输入以下命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# authentication
solace(configure/message-vpn/authentication)# oauth
solace(...gure/message-vpn/authentication/oauth)# no shutdown

要禁用客户端连接到给定消息 VPN 的 OAuth 认证,请输入以下命令:

solace(...gure/message-vpn/authentication/oauth)# shutdown

OAuth客户端认证示例配置

以下示例显示了如何在新的消息 VPN 上创建和设置用于 OAuth 认证的 OAuth 配置文件。

在此示例中:

  • OAuth 发现端点位于 https://oauthdiscovery.com,并通过 HTTPS 需要凭据 oauthServerUsername/oauthServerPassword
  • OAuth 发行者位于 https://oauthissuer.com
  • OAuth 角色设置为 resource-server,这意味着事件代理配置为期望客户端在尝试认证时呈现访问令牌。
solace(configure)# create message-vpn oauthExample
solace(configure/message-vpn)# authentication oauth
solace(...gure/message-vpn/authentication/oauth)# no shutdown
solace(...gure/message-vpn/authentication/oauth)# default-profile myOauthProfile
solace(...gure/message-vpn/authentication/oauth)# create profile myOauthProfile
solace(...sage-vpn/authentication/oauth/profile)# no shutdown
solace(...sage-vpn/authentication/oauth/profile)# oauth-role resource-server
solace(...sage-vpn/authentication/oauth/profile)# issuer https://oauthissuer.com
solace(...sage-vpn/authentication/oauth/profile)# client-id oauthServerUsername
solace(...sage-vpn/authentication/oauth/profile)# client-secret oauthServerPassword
solace(...uthentication/oauth/profile/endpoints)# discovery https://oauthdiscovery.com

与旧版本的兼容性

为了与 9.12.1 之前的版本兼容,OAuth 提供商用于 MQTT 客户端的命令已弃用,但将继续工作,直到 2024 年 9 月 15 日。2024 年 9 月 15 日之后,这些命令将被移除。

如果您有一个现有的 OAuth MQTT 部署,您必须在弃用期限结束前将您的 OAuth 提供商配置迁移到消息 VPN OAuth 配置文件配置。

OAuth 提供商与消息 VPN 中的 OAuth 配置文件之间的差异

  • OAuth 发行者标识符用于识别适当的 OAuth 提供商配置。在大多数情况下,这允许仅从令牌本身识别适当的提供商。注意,明确指定提供商的 MQTT 客户端仍必须指定代理配置名称,以保持 API 兼容性。
  • 支持 OpenID Connect Userinfo 端点(类似于 OAuth 内省端点)。
  • 用户名和组声明在多个位置搜索,支持部署中同时存在厚令牌(包含额外信息(如组)的令牌)和薄令牌(仅包含认证所需最少信息的令牌)的情况。
  • 从发现 URL 获取配置,这意味着您不需要配置其他端点和发行者标识符。
  • 验证发行者身份,以及其他多项安全检查。
  • 允许的 OAuth 类型(OpenID Connect 或纯 OAuth)由配置中的 OAuth 角色(请参阅 OAuth 角色)确定,而不是根据连接信息在每个连接基础上动态确定。
  • 没有配置标志可以忽略令牌中指定的时间限制。

配置重复客户端的连接行为

当新客户端连接到事件代理,并且该客户端使用与现有连接客户端相同的客户端名称时,您可以配置事件代理以:

  • 拒绝新重复客户端的连接尝试(即,不替换现有客户端)
  • 断开现有客户端的连接并连接新重复客户端

默认情况下,在事件代理上启用认证期间替换重复客户端连接。

要启用认证期间替换重复客户端连接,请输入以下 CONFIG 命令:

solace(configure)# authentication
solace(configure/authentication)# replace-duplicate-client-connections

此命令的 no 版本,no replace-duplicate-client-connections,禁用认证期间替换重复客户端连接。

当与 Web 消息客户端一起使用时,通过 no replace-duplicate-client-connections 认证 CONFIG 命令禁用认证期间替换重复客户端连接可能会在经历短暂网络拥塞时导致临时服务中断。这是由于事件代理使旧 Web 客户端会话过期并接受替换所需的时间。