[AIX][MQ 9.4.0 2024 年 6 月][Linux]

在应用程序中使用认证令牌

编写应用程序以在连接到 IBM® MQ 队列管理器时提供认证令牌。

开始之前

IBM MQ 9.4.0开始,应用程序可以在连接到队列管理器时提供认证令牌。

应用程序必须满足以下要求:
  • 它必须以 C 或 Java 编写 (使用 IBM MQ classes for JMS/ Jakarta Messaging)
  • 它必须作为 IBM MQ client连接到队列管理器。 即,应用程序必须通过网络连接到队列管理器,而不是使用本地绑定。
  • 它必须连接到在 AIX®Linux®上运行的队列管理器。
如果应用程序不满足这些需求,那么连接将失败,并且会将原因码 MQRC_FUNCTION_NOT_SUPPORTED (2298) 返回到应用程序。

提供认证令牌的应用程序可以在支持 IBM MQ MQI clients的任何平台上运行。

使用自动客户机重新连接的客户机在连接时无法提供认证令牌。 如果应用程序提供认证令牌,并在 MQCNO 结构中指定 MQCNO_RECONNECTMQCNO_RECONNECT_Q_MGR 选项,那么连接将失败并将原因码MQRC_RECONNECT_不兼容 (2547) 返回到应用程序。 有关自动客户机重新连接的更多信息,请参阅 自动客户机重新连接

如果由于这些需求而无法编写应用程序以提供认证令牌,那么也可以通过使用客户机安全性出口来迁移应用程序以使用认证令牌。 可以写入客户机安全出口以在 MQCSP 结构中设置认证令牌。 有关安全出口的更多信息,请参阅 客户机连接上的安全出口

IBM MQ 9.4.0 开始,JMS 客户端应用程序可在连接时直接提供令牌(请参阅 从您选择的令牌发行机构获取身份验证令牌)。 在 IBM MQ 9.4.0之前, Java 应用程序可以通过出口程序间接提供令牌。 有关更多信息,请参阅 Java 类 MQCSP

[ MQ 9.4.3 2025 年 6 月]IBM MQ 9.4.3JMS 应用程序可以配置连接工厂属性,这样 IBM MQ JMS 库就可以代表应用程序从令牌提供者 URL 获取令牌。 然后,令牌会被发送到队列管理器进行验证。 这也适用于可重新连接的客户端,也就是说,如果 WMQ_CLIENT_RECONNECT_OPTIONS 设置为 WMQ_CLIENT_RECONNECTWMQ_CLIENT_RECONNECT_Q_MGR

关于本任务

注: 将对符合 JSON Web 签名 (JWS) 标准的认证令牌进行签名,以允许验证令牌的真实性,但不会对其进行加密。 因此,具有令牌访问权的任何人都可以读取并可能复用该令牌。 配置与队列管理器的连接,以确保在通过网络 (例如,使用 TLS) 发送认证令牌时使用加密对其进行保护。 有关保护应用程序提供的凭证的选项的更多信息,请参阅 MQCSP 密码保护
在修改应用程序以使用令牌进行连接之前,请确保

要在应用程序连接到 IBM MQ 队列管理器时提供认证令牌,请包含以下过程。

过程

  • 要从 C (MQI) 应用程序提供认证令牌:
    应用程序必须使用 MQCONNX (而不是 MQCONN) 进行连接,并提供 MQCSP 结构:
    • AuthenticationType 字段必须设置为 MQCSP_AUTH_ID_TOKEN。
    • 该结构的版本必须设置为 MQCSP_VERSION_3。
    • TokenPtrTokenOffset 字段必须引用您的身份验证令牌。
    • TokenLength 字段必须设置为身份验证令牌的长度。
    使用 MQCSP V 3 和认证令牌连接到队列管理器的示例 C 代码:
    MQCNO cno = {MQCNO_DEFAULT};   /* Connection options  */
    MQCSP csp = {MQCSP_DEFAULT};   /* Security parameters */
    
    char  token[MQ_CSP_TOKEN_LENGTH +1] = {0};  /* Authentication token string */
    
    /* Set the connection options */
    cno.SecurityParmsPtr = &csp;
    cno.Version = MQCNO_VERSION_5;
    
    /* Set the security parameters */
    csp.Version = MQCSP_VERSION_3;
    csp.AuthenticationType = MQCSP_AUTH_ID_TOKEN;
    csp.TokenPtr = token;
    csp.TokenLength = (MQLONG) strlen(token);
    
    /* Connect to the queue manager */
    MQCONNX(qmName,                 /* Queue manager name  */
            &cno,                   /* Connection options  */
            &hCon,                  /* Connection handle   */
            &compCode,              /* Completion code     */
            &reason);               /* Reason code         */
  • 要从 Java 应用程序提供认证令牌:
    使用 IBM MQ classes for JMS/Jakarta Messaging 的应用程序可通过 createContextcreateConnection 方法提供令牌,这些方法都需要用户名和密码。
    提供验证令牌:
    • UserID 必须设置为空或空字符串,即不含空格, ""
    • 令牌作为 Password 字符串提供。
    这适用于 ConnectionFactory 接口的所有 IBM MQ 实现。

    可以使用显式参数格式 (例如, createContext(String userID, String password)) 或隐式参数版本 (例如, createContext())。

    在后一种情况下,必须首先提供空的 userID 和令牌 Password 作为连接工厂上的属性。

    用于使用认证令牌连接到队列管理器的示例 Java 代码:
    // Obtain token from authentication provider here:
    
    String myToken = "xxxxxxxxxxxxxxxx";
    
    // Acquire instance of an MQ connection Factory:
    
    JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
    
    JmsConnectionFactory cf = ff.createConnectionFactory();
    
    // Configure any required CF properties here - e.g. MQ Channel details
    
    // Connect to (and authenticate with) the queue manager:
    
    context = cf.createContext(null, myToken); // NOTE - null userID indicates token being provided
    如果连接失败,原因码为 MQRC_NOT_AUTHORIZED (2035) 或 MQRC_SECURITY_ERROR (2063) ,请检查队列管理器错误日志以获取包含有关失败原因的更多信息的错误消息。 有关诊断认证令牌问题的更多帮助,请参阅 对认证令牌问题进行故障诊断
  • [ MQ 9.4.3 2025 年 6 月]Java 应用程序提供身份验证令牌,其中 IBM MQ JMS 库代表应用程序从令牌提供者 URL 获取令牌:
    连接工厂定义必须包括 TOKEN_CLIENT_IDTOKEN_ENDPOINTTOKEN_CLIENT_SECRET 属性,如下例所示
    用于使用认证令牌连接到队列管理器的示例 Java 代码:
    // Acquire instance of an MQ connection Factory:
    JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
    
    JmsConnectionFactory cf = ff.createConnectionFactory();
    // Configure any required CF properties here
    cf.setStringProperty(WMQConstants.TOKEN_ENDPOINT, tokenEndpoint);
    cf.setStringProperty(WMQConstants.TOKEN_CLIENT_ID, clientId);
    cf.setStringProperty(WMQConstants.TOKEN_CLIENT_SECRET, clientSecret);
    context = cf.createContext();
    如果连接失败,原因码为 MQRC_NOT_AUTHORIZED (2035) 或 MQRC_SECURITY_ERROR (2063) ,请检查队列管理器错误日志以获取包含有关失败原因的更多信息的错误消息。 有关诊断认证令牌问题的更多帮助,请参阅 对认证令牌问题进行故障诊断

结果

应用程序现在已连接到队列管理器。 它将保持连接状态,直到断开连接为止,即使用于认证的令牌到期也是如此。 如果应用程序与队列管理器断开连接并且需要重新连接,那么它可能需要获取新的认证令牌以及稍后的到期时间,然后才能重新连接。