Ibm mq WMQ JNDI使用身份验证进行查找

Ibm mq WMQ JNDI使用身份验证进行查找,ibm-mq,Ibm Mq,对于以下代码 public class JMSSamplePut { private static String initialContextUrl = null; private static String connectionFactoryFromJndi = "UM_QMGR_QCF"; private static String queueFromJndi = "BCUFXW.EXB.ATHENA.FX.IN"; private

对于以下代码

 public class JMSSamplePut 
    {
      private static String initialContextUrl = null;
      private static String connectionFactoryFromJndi = "UM_QMGR_QCF";
      private static String queueFromJndi = "BCUFXW.EXB.ATHENA.FX.IN";
      private static String outString = "A sample text message " +
                                    "from JMSSampleput";
      private static int retryInterval = 10;
      private static int retryCount = 3;
      private static int connStatus = 1;


      /**
       * @param args
       */
      public static void main( String[] args ) 
      {

        // Variables
        Queue                   ioQueue      = null;
        QueueSession            session      = null;
        QueueSender             queueSender  = null;
        QueueConnection         connection   = null;
        QueueConnectionFactory  factory      = null;
        boolean                 transacted   = false;
        int i = 0;

        try { 
          // Instantiate the initial context for JNDI
          String contextFactory ="com.sun.jndi.fscontext.RefFSContextFactory";
          Hashtable environment = new Hashtable();
          environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
          environment.put(Context.PROVIDER_URL, "file:/c:/jndi"); 
          Context context = new InitialDirContext(environment);
          System.out.println("Initial context found!");

          // Create a Queue ConnectionFactory
          factory = (QueueConnectionFactory) context.lookup(connectionFactoryFromJndi);

    ...........
最后一行是失败的

捕获到JMSException:com.ibm.msg.client.jms.DetailedJMSSecurityException:JMSWMQ2013:为连接模式为“client”且主机名为“NATMIB1.hostname.net(1414)”的队列管理器“”提供的安全身份验证无效。请检查您连接到的QueueManager上提供的用户名和密码是否正确 链接异常:com.ibm.mq.MQException:JMSCMQ0001:WebSphere mq调用失败,代码为“2”(“MQCC_失败”)原因为“2035”(“MQRC_未授权”)。 完成

JVM参数

-Djavax.net.ssl.keystore=c://keystore//a_dev.jks \
-Djavax.net.ssl.keyStorePassword=******** \
-Djavax.net.ssl.trustStorePassword=******** \
-Djavax.net.ssl.trustStore=c://keystore//cacerts.jks \
-Djavax.net.debug=all   
有什么建议吗?为什么是下面这行

为连接模式为“客户端”且主机名为“NATMIB1.hostname.net(1414)”的队列管理器“”提供的安全身份验证无效

看起来JNDI代理找不到队列管理器的名称? 在.bindings文件中有以下行,队列管理器名称为NATMIB1

UM_QMGR_QCF/RefAddr/3/Content=NATMIB1.xyz.net
提前谢谢


在本例中,您使用文件系统上下文作为JNDI提供程序。JMS对象以平面文件格式存储在c:/jndi目录中。正如您所做的那样,您可以在文本编辑器中查看此文件,它不是那么容易阅读,但您将能够看到对象的一些元素。顺便说一句,我建议使用WMQExplorer作为这里选择的管理工具,它可以读取和更新任何JNDI,包括文件系统上下文

最后一行是查找名为“UM_QMGR_QCF”的对象。这只是在查找对象。它不会连接到QueueManager来执行此操作,并且创建连接工厂对象不会创建回QueueManager的连接

所看到的错误将来自createConnection调用。该错误意味着createConnection调用上提供的用户ID/密码与QM上设置的任何安全性都不匹配或未进行身份验证

该错误与TCP/IP链路上的SSL设置无关

有关设置WMQ安全性的信息,可以从以下场景开始


我建议验证异常来自何处——也可以尝试对从JNDI返回的对象执行System.out.println()。所有WMQ Admin对象都将通过内置的toString()格式化自己。

如果您有正确的工具,调试WMQ安全错误是非常简单的。首先,按照说明获取并安装到WMQ Explorer中。如果您没有WMQ Explorer的现代版本,可以从下载

接下来,在QMgr上启用授权事件并重新创建错误

此时,右键单击WMQ资源管理器中的事件队列并选择格式化事件消息。这将向您显示错误的所有方面,包括:

  • 生成错误的用户ID。根据通道设置、出口和客户端设置,使用的ID可能不是您期望的ID
  • 进行的API调用。在这种情况下可能会连接,但有时这也不是您所期望的。例如,IBM JMS类将始终查询QMgr以获取DLQ名称,如果您没有授予inquire,则它将失败
  • 通话中使用的确切选项
  • 针对其发出调用的对象
  • 一旦知道了错误的这些元素,就可以确定它是否与ID本身、通道、ID的授权等有关


    更新

    针对评论中的问题,要启用授权事件,请使用MQ Explorer或runmqsc,如下所示:

    对于MQ Explorer版本,首先右键单击QMgr并选择属性

    然后在导航面板中选择事件,根据需要设置事件,然后单击
    OK


    WMQ不检查密码。使用MQ资源管理器,右键单击QMgr,然后选择属性-->事件并将授权事件切换到“已启用”,或者在runmqsc do
    ALTER QMgr AUTHOREV(已启用)
    中。