MQ上的2538错误用于SSL通道连接

时间:2017-09-22 12:21:49

标签: .net ibm-mq

我正在使用IBM WebSphere MQ 8.0版本。

我已使用“TLS_RSA_WITH_AES_256_CBC_SHA256”Cipher Spec加密配置了其中一个频道,并安装了有效证书并正确映射到密钥存储路径。

我的.NET客户端代码无法与此安全通道连接。它连续给出2538错误。 我有另一个没有加密的通道(不安全)。客户端代码可以连接到此通道而不会出现任何错误。

这是我的.NET客户端代码:

        Hashtable queueProperties = new Hashtable();
        queueProperties[MQC.HOST_NAME_PROPERTY] = host; // IP address
        queueProperties[MQC.PORT_PROPERTY] = 1541
        queueProperties[MQC.CHANNEL_PROPERTY] = channel; // channel name
        queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
        queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
        queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
        queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
        queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
        queueProperties[MQC.KEY_RESET_COUNT] = 0;
        MQEnvironment.SSLCertRevocationCheck = true;
        queueProperties[MQC.USER_ID_PROPERTY] = user; // variable
        queueProperties[MQC.PASSWORD_PROPERTY] = pwd; // variable
        try
        {
            // Attempt the connection
            queueManager = new MQQueueManager(qmgr, queueProperties);
            strReturn = "Connected Successfully";
        }

我还将MCA用户设置为具有所有必需访问权限的有效用户。

当我删除这些行并将频道名称替换为不安全的频道时,上述代码适用于不安全的频道。

    queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
    queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
    queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
    queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
    queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
    queueProperties[MQC.KEY_RESET_COUNT] = 0;
    MQEnvironment.SSLCertRevocationCheck = true;

我是否遗漏了代码或MQ配置中的任何内容?

更新1: 我发现错误是由于密钥数据库的路径不正确造成的。我已经提到了放置证书的文件夹名称之前的路径。但是,它应该是文件夹名称后面跟着没有扩展名的kdb文件。

执行此更改后,2538错误消失了。但现在我收到2059错误,并在日志中显示以下错误消息。

“在SSL握手期间协商的CipherSpec与通道所需的CipherSpec不匹配......”

My Channel配置为具有“TLS_RSA_WITH_AES_256_CBC_SHA256”,就像我在MQ Explorer中设置的那样。客户端代码也发送相同的密码规范。它仍然给出2059错误。

更新2:正如@JoshMc所建议的那样,我设置了组策略并解决了上述错误。然后我开始收到错误“频道缺少证书”。

更新3:我将SSLCAUTH更改为OPTIONAL后,此错误消失了。早些时候,它被设置为必需。感谢@JoshMc指出。

1 个答案:

答案 0 :(得分:2)

最初在您的问题中,您有以下代码行:

queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "ibmwebspheremqtestqueue";

我建议:SSL_PEER_NAME_PROPERTY用于验证队列管理器证书的部分或全部DN值,因此它的格式类似于CN=x.domain.com,OU=Y,O=Company Inc,您看起来像是证书标签。

你能看到队列管理器AMQERR01.LOG上有什么错误吗?在本地客户端AMQERR01.LOG怎么样?

您回应了队列管理器中的错误:

AMQ9660: SSL key repository: password stash file absent or unusable.

您发现每次更新时出现错误:

  

更新:我发现错误是由于密钥数据库的路径不正确造成的。我已经提到了放置证书的文件夹名称之前的路径。但是,它应该是文件夹名称后面跟着没有扩展名的kdb文件。

现在您继续收到以下错误:

The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel...

我建议:托管.net不会使用您指定的密码从Windows策略中获取。这个问题和答案应该有助于#34; IBM MQ.Net CertificateLabel, CipherSpec"。

您建议您修改组策略,然后在SSLCAUTH(REQUIRED)频道上设置SVRCONN时收到以下错误:

channel is lacking a certificate

SSLCAUTH(REQUIRED)告诉队列管理器您要求客户端拥有证书。无论SSLCAUTH设置为什么,客户端都将始终要求队列管理器拥有证书。

假设您已将队列管理器配置为执行CONNAUTH以验证您要发送的用户和密码,并且已在ADOPTCTX(YES) {{1}上设置CONNAUTH对象,然后有AUTHINFO是一个合理的设置,因为这意味着客户端和队列管理器之间的所有数据都将被加密,连接由id / pw验证。即使您有SSLCAUTH(OPTIONAL),除非您还要通过渠道SSLCAUTH(REQUIRED)属性或{{1}将SVRCONN配置为与特定DN值匹配规则' SSLPEER属性,它不提供任何形式的身份验证。

相关问题