我正在尝试使用安全的 SSL 连接来连接到远程队列。我有第三方提供的有关 SSL 连接和队列管理器详细信息的所有详细信息。我的 Windows 机器上安装了 V8 版本的 MQ 客户端。
第三方共享的SSL文件夹包含jks、kdb、rdb等文件。
我正在使用下面的代码来初始化 .net 控制台应用程序中的属性
const string SslKeyRepository = @"ssl folder location with key name included";
const string CipherSpec = "TLS_RSA_WITH_3DES_EDE_CBC_SHA";
const string CipherSuite = "SSL_RSA_WITH_3DES_EDE_CBC_SHA";
const string SslPeerName = "Peername";
const string ConnectionType = MQC.TRANSPORT_MQSERIES_CLIENT;
static Hashtable init(String connectionType)
{
Hashtable connectionProperties = new Hashtable
{
{MQC.TRANSPORT_PROPERTY, connectionType},
{MQC.PORT_PROPERTY, 1496},
{MQC.SSL_CERT_STORE_PROPERTY, SslKeyRepository},
{MQC.SSL_CIPHER_SPEC_PROPERTY, CipherSpec},
{MQC.SSL_PEER_NAME_PROPERTY, $"CN=\"{SslPeerName}\""}
};
// Add the connection type
// SSL
// Set up the rest of the connection properties, based on the
// connection type requested
switch (connectionType)
{
case MQC.TRANSPORT_MQSERIES_BINDINGS:
break;
case MQC.TRANSPORT_MQSERIES_CLIENT:
case MQC.TRANSPORT_MQSERIES_XACLIENT:
case MQC.TRANSPORT_MQSERIES_MANAGED:
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, HostName);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, Channel);
break;
}
return connectionProperties;
}
我已经尝试了一些东西,但我最终得到异常 “MQRC_SSL_INITIALIZATION_ERROR”
如果你能帮我解决这个问题,我将不胜感激。
最佳答案
MQRC_SSL_INITIALIZATION_ERROR
的原因有很多。其中一些是机械问题,例如是否可以访问 keystore 文件。有些是程序性的,例如握手是否失败。最好的诊断方法是有条不紊地检查配置,然后执行差异测试。
对于第一部分,执行以下检查。如果您已经这样做了,请不要偷工减料。再做一次。
- 通过针对 KDB 发出
runmqakm -cert -list
来验证证书是否可以访问,以验证它在结构上是否完好无损并且存储文件存在且密码正确。 - 验证 kdb 文件不在世界可读目录中,即文件未标记为世界可读。
- 确认运行该应用的服务帐户是 KDB 文件和包含文件夹的所有者,并且具有写入权限。 (不知道为什么,但 GSKit 坚持 KDB 在运行时必须是可写的。)
- 发出
runmqakm -cert -details
以验证与队列管理器对应的证书是否存在以及详细信息。如果 QMgr 使用自签名证书,则只有一个。如果 QMgr 使用 CA 签名的证书,则应该有一个中间签名者和一个根签名者。 - 从第 3 方处了解他们是否指定了
SSLCAUTH(OPTIONAL)
或SSLCAUTH(REQUIRED)
。如果OPTIONAL
那么 KDB 应该没有个人证书,只有签名者。如果REQUIRED
,则 KDB 必须 有个人证书并且标签必须是小写的ibmwebspheremq[serviceaccount]
。
对于差异测试,请尝试以下一些测试:
- 通过使用 TLS 连接到本地 QMgr 来测试应用程序(注意:MQ 多年未使用 SSL。现在是 TLS。不过,旧的字段名称仍然保留 SSL 标签。)直到您知道它已正确配置。去拿一份 MQ Advanced for Developers您可以使用自己的 QMgr 在桌面上进行集成测试,完全免费许可。
- 使用示例程序之一进行测试。使用
amqsputc
或amqsgetc
,具体取决于实际应用程序是否应该在队列中包含PUT
或GET
。它们使用相同的 KDB、相同的证书等。主要区别在于它们是已知良好的代码。 - 请您的业务合作伙伴让您在不使用 SSL 的情况下进行测试,以确保配置的“机械”部分正确无误。这包括防火墙路由、主机、端口和 channel 名称、QMgr 名称等。如果您无法连接明文 channel ,那么您肯定无法使用 TLS channel 。
- 一旦成功,就启用 SSL 并在 QMgr 中设置
SSLCAUTH(OPTIONAL)
进行测试。这表明客户端可以验证 QMgr 的证书。 - 一旦成功,并且如果目标是使用相互身份验证,请使用在 QMgr 中设置的
SSLCAUTH(REQUIRED)
和本地 KDB 中的个人证书进行测试。这表明 QMgr 可以验证客户端的证书。 - 然后,并且只有在那时,在本地打开
SSLPEER
以过滤 QMgr 证书的 DN。
如果这些没有帮助,请用您的测试的详细结果更新问题。最常见的问题包括证书标签和 KDB 权限。如果业务合作伙伴为您提供了 JKS 和 KDB,这些通常不带有个人证书,只有受信任的证书。
关于c# - IBM Websphere MQ 客户端使用 SSL 连接远程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41153746/