协商 SSL 连接时出现 IBM MQ 2538 错误
IBM MQ 2538 error negotiating an SSL connection
我们有两个连接(作为 .NET/Windows 客户端)到 IBM MQ 端点(假设非 Windows)。
我们使用 SSL,它由一对证书(客户端和服务器)支持并在 Windows 证书存储中正确标记,以确保我们选择正确的证书。
队列 A 中的一切工作正常。
队列 B 最近停止工作。我们现在收到 2538 错误。什么都没有改变。
- 我们尽可能保持两个队列的两边相同。
- 我们对队列 A 和队列 B 进行了有线跟踪,并且可以确认队列 B 上的 SSL 协商不完整,因为客户端"Connection Reset"[=72] =]
- 所有证书均有效且符合日期
- 我们已经尝试在各方之间使用高度信任的自签名证书
感觉可能是通信错误阻止了成功的 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 建议我打开日志记录。
由此,我了解到:
- 无法(正确地)在二进制文件夹或我的个人文件夹中找到
mqclient.ini
文件。
- 在 SSL 身份验证期间开始出现错误,特别是
System.ComponentModel.Win32Exception (0x80004005): The credentials supplied to the package were not recognized
- 后面跟着主持人貌似消失了:
MQTCPConnection.ConnectSocket(string,string,MQLONG) rc=OK
00000174 10:29:28.917526 5748.1 CompCode: 2, Reason: 2538
AMQ9202: Remote host 'x.x.x.x(y)' not available, retry later.
- 其中有 2538 个
CompCode: 2, Reason: 2538
- 协商似乎仍在继续,使用适当的 TLS 版本等
- 然后当尝试获取客户端(使用我们的私钥)证书时,我们得到
System.ComponentModel.Win32Exception (0x80004005): The credentials supplied to the package were not recognized
我仔细检查了用户是否 拥有私钥的权限。
更新 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
的文件,其中包含以下内容,其中 MQTRACEPATH
和 MQERRORPATH
指向用户 运行 您的目录应用程序可以写入。
<?xml version="1.0" encoding="utf-8"?>
<traceSettings>
<MQTRACELEVEL>2</MQTRACELEVEL>
<MQTRACEPATH>C:\MQTRACEPATH</MQTRACEPATH>
<MQERRORPATH>C:\MQERRORLOGPATH</MQERRORPATH>
</traceSettings>
请注意,您可以在 2
和 0
之间切换 MQTRACELEVEL
以动态打开或关闭 运行 程序的跟踪。
在 MQIPT 方面,如果您使用库存 mqipt.ske
启动 MQIPT 实例,您可以在启动 MQIPT 之前设置环境变量 MQIPT_JVM_OPTIONS="-Djavax.net.debug=ssl"
,这将导致 java向 logs
目录中的 mqipt.stdout.log
提供 TLS 调试日志记录。
我们有两个连接(作为 .NET/Windows 客户端)到 IBM MQ 端点(假设非 Windows)。
我们使用 SSL,它由一对证书(客户端和服务器)支持并在 Windows 证书存储中正确标记,以确保我们选择正确的证书。
队列 A 中的一切工作正常。
队列 B 最近停止工作。我们现在收到 2538 错误。什么都没有改变。
- 我们尽可能保持两个队列的两边相同。
- 我们对队列 A 和队列 B 进行了有线跟踪,并且可以确认队列 B 上的 SSL 协商不完整,因为客户端"Connection Reset"[=72] =]
- 所有证书均有效且符合日期
- 我们已经尝试在各方之间使用高度信任的自签名证书
感觉可能是通信错误阻止了成功的 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 建议我打开日志记录。
由此,我了解到:
- 无法(正确地)在二进制文件夹或我的个人文件夹中找到
mqclient.ini
文件。 - 在 SSL 身份验证期间开始出现错误,特别是
System.ComponentModel.Win32Exception (0x80004005): The credentials supplied to the package were not recognized
- 后面跟着主持人貌似消失了:
MQTCPConnection.ConnectSocket(string,string,MQLONG) rc=OK 00000174 10:29:28.917526 5748.1 CompCode: 2, Reason: 2538 AMQ9202: Remote host 'x.x.x.x(y)' not available, retry later.
- 其中有 2538 个
CompCode: 2, Reason: 2538
- 协商似乎仍在继续,使用适当的 TLS 版本等
- 然后当尝试获取客户端(使用我们的私钥)证书时,我们得到
System.ComponentModel.Win32Exception (0x80004005): The credentials supplied to the package were not recognized
我仔细检查了用户是否 拥有私钥的权限。
更新 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
的文件,其中包含以下内容,其中 MQTRACEPATH
和 MQERRORPATH
指向用户 运行 您的目录应用程序可以写入。
<?xml version="1.0" encoding="utf-8"?> <traceSettings> <MQTRACELEVEL>2</MQTRACELEVEL> <MQTRACEPATH>C:\MQTRACEPATH</MQTRACEPATH> <MQERRORPATH>C:\MQERRORLOGPATH</MQERRORPATH> </traceSettings>
请注意,您可以在 2
和 0
之间切换 MQTRACELEVEL
以动态打开或关闭 运行 程序的跟踪。
在 MQIPT 方面,如果您使用库存 mqipt.ske
启动 MQIPT 实例,您可以在启动 MQIPT 之前设置环境变量 MQIPT_JVM_OPTIONS="-Djavax.net.debug=ssl"
,这将导致 java向 logs
目录中的 mqipt.stdout.log
提供 TLS 调试日志记录。