协商 SSL 连接时出现 IBM MQ 2538 错误

IBM MQ 2538 error negotiating an SSL connection

我们有两个连接(作为 .NET/Windows 客户端)到 IBM MQ 端点(假设非 Windows)。

我们使用 SSL,它由一对证书(客户端和服务器)支持并在 Windows 证书存储中正确标记,以确保我们选择正确的证书。

队列 A 中的一切工作正常。

队列 B 最近停止工作。我们现在收到 2538 错误。什么都没有改变。

感觉可能是通信错误阻止了成功的 SSL 握手。

我们使用的 WebSphereMqClient NuGet 包(8.0.0.7 - 最新版本)加剧了这个问题,除了在调用时出现 2538 错误外没有给我们任何其他信息:

_mqQueueManager = new MQQueueManager((string)queueManager, (Hashtable)connectionProperties);

正在(编辑)的连接属性:

<IbmMqConnection server="ipaddress" 
                         portNumber="1234" 
                         channel="SOME.CHANNEL" 
                         queueManager="QUEUE_MANAGER">
    <SecureConnection enabled="True" 
                      cipherSuite="TLS_RSA_WITH_AES_256_CBC_SHA256" 
                      cipherSpec="TLS_RSA_WITH_AES_256_CBC_SHA256" 
                      peerName="CN=trusted-parties-cn"
                      certificateLabel="ibmwebspheremq"
                       />

有什么专家可以给我们提供线索吗?有没有办法从 NuGet 黑匣子中获取任何诊断信息?

更新 1:

服务器是运行8.0.0.9.

更新二:

@JoshMc 建议我打开日志记录。

由此,我了解到:

我仔细检查了用户是否 拥有私钥的权限。

更新 3

发现问题。

文本 System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure. 突出显示了该问题。经调查发现,私钥的权限已在证书更新期间被删除。我知道上面说权限已确认存在,但用于不同的证书。我把它留在里面以保留 history/honesty.

按照@JoshMc 的建议,通过启用日志记录解决了问题。

日志条目:

000001C9 11:16:51.194536   2072.1      System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
at IBM.WMQ.Nmqi.MQEncryptedSocket.MakeSecuredConnection()
at IBM.WMQ.Nmqi.MQEncryptedSocket..ctor(NmqiEnvironment env, MQTCPConnection conn, Socket socket, MQChannelDefinition mqcd, MQSSLConfigOptions sslConfigOptions)
at IBM.WMQ.MQTCPConnection.ConnectSocket(String localAddr, String connectionName, Int32 options)

...让我们直奔问题,即用于访问 Windows 证书存储中的私钥的凭据无效。经调查,他们不在场。

确保将此步骤作为续订 SSL 证书过程的一部分。

NuGet 包只是独立的 amqmdnet.dll,IBM 允许您从完整的 MQ 客户端安装或通过可再分发的客户端 zip 文件下载。

如果您想让它们为独立托管的 .NET MQ 客户端打开跟踪,您需要按照 Developing applications > Developing .NET applications > Writing and deploying IBM MQ .NET programs > Using the stand-alone IBM MQ .NET client.

中的说明进行操作

您首先将以下内容添加到您的 app.config 并将该值指向您可以在其中创建文件的目录。

<appSettings>
<add key="MQTRACECONFIGFILEPATH" value="C:\MQTRACECONFIG" />
</appSettings>

然后您在上述目录中创建一个名为 trace.config 的文件,其中包含以下内容,其中 MQTRACEPATHMQERRORPATH 指向用户 运行 您的目录应用程序可以写入。

<?xml version="1.0" encoding="utf-8"?>
<traceSettings>
  <MQTRACELEVEL>2</MQTRACELEVEL>
  <MQTRACEPATH>C:\MQTRACEPATH</MQTRACEPATH>
  <MQERRORPATH>C:\MQERRORLOGPATH</MQERRORPATH>
</traceSettings>

请注意,您可以在 20 之间切换 MQTRACELEVEL 以动态打开或关闭 运行 程序的跟踪。


在 MQIPT 方面,如果您使用库存 mqipt.ske 启动 MQIPT 实例,您可以在启动 MQIPT 之前设置环境变量 MQIPT_JVM_OPTIONS="-Djavax.net.debug=ssl",这将导致 java向 logs 目录中的 mqipt.stdout.log 提供 TLS 调试日志记录。