2016-12-14 122 views
2

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

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

我使用下面的代码来初始化

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; 
     } 

我已经试过几件事情在.NET控制台应用程序的属性,但我最终得到例外“MQRC_SSL_INITIALIZATION_ERROR”

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

+1

@prashant离线与我联系。用Peer Name来怀疑问题,格式似乎不正确。 – Shashi

+0

@Shashi为什么它会提供与SSL有关的异常?它应该与Peer name相关。我是否需要使用特定的用户标识运行控制台应用程序?我得到了第三方的回应,说它可能是“用户标识符和密钥库文件ID不匹配” – prashant

+0

对端名称是初始化安全通道所需的属性。对于初始化安全通道时遇到的错误,IBM MQ返回MQRC_SSL_INITIALIZATION_ERROR。您是否已与第三方确认您的应用程序设置的SSL属性是正确的? – Shashi

回答

0

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

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

  • 验证证书是通过发出runmqakm -cert -list对KDB以验证它是结构完整和存储文件存在与正确的密码访问。
  • 确认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,这些应该通常而不是带有个人证书,只有可信任的证书。

+0

非常感谢您的详细解答。我会试一试。 – prashant