我正在使用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指出。
答案 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
属性,它不提供任何形式的身份验证。