.NET连接IBM MQ时CipherSpec协商不匹配问题咨询
RedHat环境下的.NET客户端尝试连接IBM MQ队列,代码中指定CipherSpec为TLS_RSA_WITH_AES_256_CBC_SHA256,但服务器日志显示SSL握手协商的CipherSpec为TLS_RSA_WITH_AES_256_GCM_SHA384,触发AMQ9631E错误,该现象的原因如下:
客户端连接代码
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; IConnection connectionMQ; factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ); IConnectionFactory cf = factoryFactory.CreateConnectionFactory(); cf.SetStringProperty(XMSC.WMQ_HOST_NAME, "host"); cf.SetIntProperty(XMSC.WMQ_PORT, port); cf.SetStringProperty(XMSC.WMQ_CHANNEL, "channel"); cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT); cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "queueManager"); cf.SetStringProperty(XMSC.WMQ_SSL_PEER_NAME, "sslPeerName"); cf.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC, "TLS_RSA_WITH_AES_256_CBC_SHA256"); cf.SetStringProperty(XMSC.WMQ_CCSID, "ccSid"); cf.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, "*USER"); cf.SetStringProperty(XMSC.WMQ_SSL_CLIENT_CERT_LABEL, "clientCertLabel"); connectionMQ = cf.CreateConnection();
服务器端错误信息(翻译后)
AMQ9631E: SSL握手期间协商的CipherSpec与通道'channel'要求的CipherSpec不匹配。
说明:通道'channel'的本地端和远程端之间存在CipherSpec不匹配。此不匹配解决前,通道无法运行。本地通道定义要求的CipherSpec为'TLS_RSA_WITH_AES_256_CBC_SHA256'。SSL握手期间协商的CipherSpec名称为'TLS_RSA_WITH_AES_256_GCM_SHA384'。如果无法确定协商的CipherSpec名称,会显示代码。
操作:修改通道'channel'的定义,使两端的CipherSpec匹配,然后重启通道。使用'ANY'类型的CipherSpec时,确保客户端CipherSpec值符合通道'channel'上设置的'TLS_RSA_WITH_AES_256_CBC_SHA256'的要求。如果客户端设置为使用'ANY'类型的CipherSpec,TLS握手可能会使用通道定义CipherSpec不允许的更高版本协议。如果通道一端使用的是全局服务器证书,协商的CipherSpec可能与两端指定的都不匹配。这是因为SSL协议允许全局服务器证书自动协商更高等级的加密。这种情况下,请指定符合全局服务器证书要求的CipherSpec。
原因分析
- 全局服务器证书自动协商更高加密等级:如果MQ服务器使用全局服务器证书,SSL协议会自动触发协商更安全的CipherSpec。
TLS_RSA_WITH_AES_256_GCM_SHA384采用的GCM模式比客户端指定的CBC模式安全性更高,属于更优的加密算法,因此握手过程中会优先选用该算法,忽略两端配置的TLS_RSA_WITH_AES_256_CBC_SHA256。 - TLS协议版本优先级影响:客户端代码中同时启用了TLS、TLS1.1、TLS1.2协议,而
TLS_RSA_WITH_AES_256_GCM_SHA384是TLS1.2及以上版本支持的算法,握手时会优先选用更高版本协议支持的安全算法,导致协商结果与指定CipherSpec不符。 - IBM MQ XMS驱动的CipherSpec匹配逻辑:.NET客户端使用的XMS驱动可能不会严格强制指定的CipherSpec,而是根据服务器端支持的CipherSuite列表选择优先级更高的匹配项,
TLS_RSA_WITH_AES_256_GCM_SHA384的优先级高于TLS_RSA_WITH_AES_256_CBC_SHA256,因此被选中。
内容的提问来源于stack exchange,提问作者Killer Queen

