用于 SSL 通道连接的 MQ 上的 2538 错误
2538 error on MQ for SSL channel connection
我使用的是 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 错误。
"The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel..."
我的频道配置为"TLS_RSA_WITH_AES_256_CBC_SHA256",正如我在 MQ Explorer 中设置的那样。客户端代码也发送相同的密码规范。它仍然给出 2059 错误。
更新 2:按照@JoshMc 的建议,我设置了组策略并解决了上述错误。然后我开始收到错误 "Channel is lacking certificate".
更新 3:在我将 SSLCAUTH 更改为可选后,此错误消失了。之前它被设置为 REQUIRED。感谢@JoshMc 指出。
最初在您的问题中有以下代码行:
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.
并且您根据更新发现错误:
UPDATE: I found that the error was due to incorrect path to key database. I had mentioned the path till folder name where the certificates were placed. However it was expected to be the folder name followed by the name of kdb file without extention.
现在您继续收到以下错误:
The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel...
我建议:托管 .net 不使用您指定的密码,它是从 Windows 策略中获取的。这个问题和答案应该帮助“”。
您建议您修复组策略,然后在 SVRCONN
频道上设置 SSLCAUTH(REQUIRED)
时继续收到以下错误:
channel is lacking a certificate
SSLCAUTH(REQUIRED)
告诉队列管理器您要求客户端具有证书。无论 SSLCAUTH
设置成什么,客户端总是要求队列管理器有一个证书。
假设您已将队列管理器配置为执行 CONNAUTH
以验证您发送的用户和密码,并且您已在 CONNAUTH
的 AUTHINFO
对象,那么 SSLCAUTH(OPTIONAL)
是一个合理的设置,因为这意味着客户端和队列管理器之间的所有数据都将被加密,并且连接由 id/pw 验证。即使您有 SSLCAUTH(REQUIRED)
,除非您还通过频道的 SSLPEER
属性 或 [=29] 配置 SVRCONN
以匹配特定的 DN
值=] 规则的 SSLPEER
属性 它不提供任何形式的身份验证。
我使用的是 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 错误。
"The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel..."
我的频道配置为"TLS_RSA_WITH_AES_256_CBC_SHA256",正如我在 MQ Explorer 中设置的那样。客户端代码也发送相同的密码规范。它仍然给出 2059 错误。
更新 2:按照@JoshMc 的建议,我设置了组策略并解决了上述错误。然后我开始收到错误 "Channel is lacking certificate".
更新 3:在我将 SSLCAUTH 更改为可选后,此错误消失了。之前它被设置为 REQUIRED。感谢@JoshMc 指出。
最初在您的问题中有以下代码行:
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.
并且您根据更新发现错误:
UPDATE: I found that the error was due to incorrect path to key database. I had mentioned the path till folder name where the certificates were placed. However it was expected to be the folder name followed by the name of kdb file without extention.
现在您继续收到以下错误:
The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel...
我建议:托管 .net 不使用您指定的密码,它是从 Windows 策略中获取的。这个问题和答案应该帮助“
您建议您修复组策略,然后在 SVRCONN
频道上设置 SSLCAUTH(REQUIRED)
时继续收到以下错误:
channel is lacking a certificate
SSLCAUTH(REQUIRED)
告诉队列管理器您要求客户端具有证书。无论 SSLCAUTH
设置成什么,客户端总是要求队列管理器有一个证书。
假设您已将队列管理器配置为执行 CONNAUTH
以验证您发送的用户和密码,并且您已在 CONNAUTH
的 AUTHINFO
对象,那么 SSLCAUTH(OPTIONAL)
是一个合理的设置,因为这意味着客户端和队列管理器之间的所有数据都将被加密,并且连接由 id/pw 验证。即使您有 SSLCAUTH(REQUIRED)
,除非您还通过频道的 SSLPEER
属性 或 [=29] 配置 SVRCONN
以匹配特定的 DN
值=] 规则的 SSLPEER
属性 它不提供任何形式的身份验证。