【问题标题】:IBM Webshpere MQ client connecting remote queue using SSLIBM Websphere MQ 客户端使用 SSL 连接远程队列
【发布时间】:2017-04-30 10:35:12
【问题描述】:

我正在尝试使用安全 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"

如果您能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • @prashant 离线联系了我。怀疑 Peer Name 的问题,格式似乎不正确。
  • @Shashi 为什么会给出与 SSL 相关的异常?它应该与 Peer name 相关。我是否需要使用特定的用户 ID 运行控制台应用程序?我收到第三方的回复说它可能是“用户 ID 和密钥库文件 ID 不匹配”
  • PeerName 是初始化安全通道所需的属性。对于初始化安全通道时遇到的错误,IBM MQ 返回 MQRC_SSL_INITIALIZATION_ERROR。您是否与第三方确认您的应用设置的 SSL 属性是正确的?

标签: c# .net ssl ibm-mq


【解决方案1】:

MQRC_SSL_INITIALIZATION_ERROR 的原因有很多。其中一些是机械问题,例如是否可以访问密钥库文件。有些是程序性的,例如握手是否失败。最好的诊断方法是有条不紊地检查配置,然后进行差异测试。

对于第一部分,请执行以下检查。如果您已经这样做了,请不要偷工减料。再做一次。

  • 通过对 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 在桌面上进行集成测试,完全免费。
  • 使用示例程序之一进行测试。使用amqsputcamqsgetc,具体取决于实际应用程序是否应该在队列中有PUTGET。它们使用相同的 KDB、相同的证书等。主要区别在于它们是已知良好的代码。
  • 请您的业务合作伙伴让您在不使用 SSL 的情况下进行测试,以确保配置的“机械”部分正确。这包括防火墙路由、主机、端口和通道名称、QMgr 名称等。如果您无法连接明文通道,那么您肯定无法使用 TLS 通道。
  • 一旦成功,请在启用 SSL 并在 QMgr 中设置SSLCAUTH(OPTIONAL) 的情况下进行测试。这表明客户端可以验证 QMgr 的证书。
  • 一旦成功,并且如果目标是使用相互身份验证,请使用在 QMgr 中设置的 SSLCAUTH(REQUIRED) 和在本地 KDB 中的个人证书进行测试。这表明 QMgr 可以验证客户的证书。
  • 然后,也只有这样,在本地打开 SSLPEER 以过滤 QMgr 证书的 DN。

如果这些都没有帮助,请用您的详细测试结果更新问题。最常见的问题包括证书标签和 KDB 权限。如果业务合作伙伴向您提供 JKS 和 KDB,则这些通常应附带个人证书,只有受信任的证书。

【讨论】:

  • 非常感谢您的详细回答。我会试一试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-02-09
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多