使用SSL连接远程队列的IBM Webshpere MQ客户端

时间:2016-12-14 23:02:55

标签: c# .net ssl ibm-mq

我正在尝试使用安全的SSL连接连接到远程队列。我已获得第三方提供的有关SSL连接和队列管理器详细信息的所有详细信息。我的Windows机器上安装了V8版本的MQ客户端。

第三方共享的SSL文件夹包含jks,kdb,rdb和sth文件。

我使用下面的代码来初始化.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"

如果你能帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

  • 通过针对KDB发出runmqakm -cert -list来验证证书是否可访问,以验证它是否完整,并且存储文件是否存在正确的密码。
  • 验证kdb文件不在世界可读目录中,文件未标记为世界可读。
  • 验证运行应用程序的服务帐户是否为KDB文件的所有者并包含文件夹,并具有写访问权限。 (不确定为什么但是GSKit坚持认为KDB必须在运行时可写。)
  • 问题runmqakm -cert -details以验证对应于队列管理器的证书是否存在以及详细信息。如果QMgr使用自签名证书,则只有一个。如果QMgr使用CA签名的证书,则应该有中间签名者和根签名者。
  • 从第三方中了解他们是否已指定SSLCAUTH(OPTIONAL)SSLCAUTH(REQUIRED)。如果OPTIONAL那么KDB应该没有个人证书,只有签名者。如果REQUIRED,那么KDB 必须拥有个人证书,并且标签必须为ibmwebspheremq[serviceaccount]小写。

对于差分测试,请尝试以下一些测试:

  • 通过使用TLS连接到本地QMgr来测试应用程序(注意:MQ多年来一直没有使用SSL。现在是TLS。旧字段名称仍保留SSL标签。 )直到您知道它已正确配置。去获取MQ Advanced for Developers的副本,您可以使用自己的QMgr在桌面上进行集成测试,免费获得完全许可。
  • 使用其中一个示例程序进行测试。使用amqsputcamqsgetc,具体取决于真实应用是否应该在队列中包含PUTGET。它们使用相同的KDB,samme证书等,主要区别在于它们是已知的 - 良好的代码。
  • 让您的业务合作伙伴让您在没有SSL的情况下进行测试,以确保"机械"部分配置是正确的。这包括防火墙路由,主机,端口和频道名称,QMgr名称等。如果您无法与纯文本频道建立联系,那么您肯定无法通过TLS频道取得成功。
  • 一旦有效,请在启用SSL并在QMgr处设置SSLCAUTH(OPTIONAL)进行测试。这表明客户端可以验证QMgr的证书。
  • 一旦有效,如果目标是使用相互身份验证,请使用QMgr中设置的SSLCAUTH(REQUIRED)和本地KDB中的个人证书进行测试。这表明QMgr可以验证客户端的证书。
  • 然后,只有这样,在本地打开SSLPEER才能过滤QMgr证书的DN。

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