一,概念
1.1 用途
用途:MQCSP 结构使授权服务能够验证用户 ID 和密码。您在 MQCONNX 调用上指定 MQCSP 连接安全参数结构。
警告:在某些情况下,客户端应用程序的 MQCSP 结构中的密码将以纯文本形式通过网络发送。要确保客户端应用程序密码得到适当保护,请参阅IBM MQ CSP 密码保护。
字符集和编码:MQCSP中的数据必须是本地队列管理器的字符集和编码;这些分别由CodedCharSetId队列管理器属性和 MQENC_NATIVE 给出。
在IBM® MQ 8.0中,您可以发送包含在 MQCSP 结构中的密码,这些密码要么通过使用IBM MQ功能进行保护,要么通过使用 TLS 加密进行加密。
1.2 MQCSP VS TLS
MQCSP 密码保护对于测试和开发目的很有用,因为使用 MQCSP 密码保护比设置 TLS 加密更简单,但不那么安全。出于生产目的,您应该优先使用 TLS 加密而不是IBM MQ 密码保护,尤其是当客户端和队列管理器之间的网络不受信任时,因为 TLS 加密更安全。
1.3 使用MQCSP场景
当满足以下所有条件时,使用密码保护:
- 连接的两端都使用IBM MQ 8.0或更高版本。
- 该通道未使用 TLS 加密。如果通道具有空白 SSLCIPH属性,或者SSLCIPH属性设置为不提供加密的 CipherSpec,则该通道未使用 TLS 加密。空密码(例如 NULL_SHA)不提供加密。
- 您设置MQCSP。AuthenticationType为 MQCSP_AUTH_USER_ID_AND_PWD。设置此值可以评估更多检查以确定是否完成密码保护。MQCSP的默认值 。AuthenticationType是 MQCSP_AUTH_NONE。默认设置下,不进行密码保护。有关详细信息,请参阅AuthenticationType。
- 如果客户端是IBM MQ Explorer 并且未启用用户标识兼容方式,这不是缺省值。此条件仅适用于IBM MQ Explorer。
如果不满足这些条件,密码将以纯文本形式发送,除非 PasswordProtection配置设置禁止。QCSP 结构
1.4 PasswordProtection
客户端和qm .ini 配置文件的 Channels 部分中的PasswordProtection属性可以防止以明文形式发送密码。该属性可以采用以下值之一。默认值是compatible
:
--------------------------------------------------------------------------------------------------------------------------
compatible:
如果队列管理器或客户端正在运行早于IBM MQ 8.0的IBM MQ版本,则可以以纯文本形式发送密码。也就是说,为了兼容性,允许使用明文密码。
所以:
- 如果使用 TLS 加密并且 CipherSpec 不为空,则密码由 TLS CipherSpec 加密发送。
- 如果队列管理器或客户端正在运行早于IBM MQ 8.0的IBM MQ版本,并且未使用 TLS 加密,那么密码将以纯文本形式发送。密码以明文形式发送,因为早于IBM MQ 8.0的IBM MQ版本只能以明文形式发送密码。
- 如果队列管理器和客户端都 在IBM MQ 8.0或更高版本上运行IBM MQ版本,并且使用空 CipherSpec 或未使用 TLS 加密,则密码将受到保护。MQCSP。AuthenticationType必须设置为 MQCSP_AUTH_USER_ID_AND_PWD。
- 如果队列管理器和客户端都在IBM MQ 8.0或更高版本和 MQCSP上运行IBM MQ版本,则在发送密码之前连接失败。AuthenticationType未设置为 MQCSP_AUTH_USER_ID_AND_PWD。
always:
密码必须使用非空 CipherSpec 的 CipherSpec 或 MQCSP 加密。AuthenticationType必须设置为 MQCSP_AUTH_USER_ID_AND_PWD。否则,连接失败。即不允许明文密码。
所以:
- 如果使用 TLS 加密并且 CipherSpec 不为空,则密码由 TLS CipherSpec 加密发送。
- 如果队列管理器和客户端都 在IBM MQ 8.0或更高版本上运行IBM MQ版本,并且未使用 TLS 加密或使用空 CipherSpec,则密码将受到保护。MQCSP。AuthenticationType必须设置为 MQCSP_AUTH_USER_ID_AND_PWD。
- 如果队列管理器或客户端正在运行早于IBM MQ 8.0的IBM MQ版本,并且未使用 TLS 加密,那么在发送密码之前连接失败。由于IBM MQ 8.0之前的IBM MQ版本只能以明文形式发送密码,并且 要求对密码进行加密或保护,因此连接失败。
optional:
密码可以选择以受保护的方式发送,但如果是 MQCSP 则以纯文本形式发送。AuthenticationType未设置为 MQCSP_AUTH_USER_ID_AND_PWD。也就是说,允许任何客户端发送明文密码。
所以:
- 如果使用 TLS 加密并且 CipherSpec 不为空,则密码由 TLS CipherSpec 加密发送。
- 如果使用空 CipherSpec 和 MQCSP ,密码将以纯文本形式发送。AuthenticationType未设置为 MQCSP_AUTH_USER_ID_AND_PWD。
- 如果队列管理器或客户端正在运行早于IBM MQ 8.0的IBM MQ版本,并且未使用 TLS 加密,那么密码将以纯文本形式发送。密码以明文形式发送,因为早于IBM MQ 8.0的IBM MQ版本只能以明文形式发送密码。
- 如果队列管理器和客户端都 在IBM MQ 8.0或更高版本上运行IBM MQ版本、未使用 TLS 加密或使用空 CipherSpec 以及MQCSP ,则密码将被保护发送。AuthenticationType设置为 MQCSP_AUTH_USER_ID_AND_PWD。
warn:
允许任何客户端发送明文密码。如果收到明文密码,则会将一条警告消息 (AMQ9297) 写入队列管理器错误日志。
--------------------------------------------------------------------------------------------------------------------------
对于 Java 和 JMS 客户端,PasswordProtection属性的行为会根据使用兼容模式或 MQCSP 模式的选择而变化:
- 如果 Java 和 JMS 客户端在兼容模式下运行,则 MQCSP 结构在连接处理期间不会流动。因此,PasswordProtection属性的行为与针对运行早于IBM MQ 8.0的IBM MQ 版本的客户端所描述的行为相同。
- 如果 Java 和 JMS 客户端在 MQCSP 模式下运行,那么 PasswordProtection属性的行为就是所描述的行为。
二,MQCSP结构
MQCSP 结构
三,MQCSP 的 C 声明