1

アプリケーションでリモート キューに接続する必要がありますが、MQ ファームでセキュリティを有効にすると認証エラー (RC 2035) が発生します。Spring 構成を使用すると、デフォルト キューにアクセスしようとしてはいけません。 、setDirectAuth プロパティに遭遇しました。この問題は解決しますか?エラーの原因となるプロパティを見逃した場合はアドバイスしてください。

エラー:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [META-INF/spring.xml]: Invocation of init method failed; nested exception is javax.naming.ServiceUnavailableException: Unable to connect to the target queue manager XXXX.XXX.XXX.com:1415/xxx.SVRCONN [Root exception is com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'.]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [META-INF/spring.xml]: Invocation of init method failed; nested exception is javax.naming.ServiceUnavailableException: Unable to connect to the target queue manager xxxx.xxx.xxx.com:1415/xxx.SVRCONN [Root exception is com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'.]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

Context.xml

<Resource 
    name="jms/MQConnectionFactory" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueueConnectionFactory" 
    factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory" 
    description="JMS Queue Connection Factory for sending messages" 
    HOST="XX.XXX.XXX.XX"
    PORT="XXXX"
    CHAN="MQ.CHANNEL"
    TRAN="1" 
    QMGR="TEST01"
/> 

<Resource 
    name="jms/QueueSU" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueue" 
    factory="com.ibm.mq.jms.MQQueueFactory" 
    description="JMS Queue for status update" 
    QU="Q01" 
/> 

<Resource 
    name="jms/QueueBM" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueue" 
    factory="com.ibm.mq.jms.MQQueueFactory" 
    description="JMS Queue for bond management" 
    QU="Q02" 
/> 

プロパティ ファイル:

#JMS Provider
jms.factory.initial=com.ibm.mq.jms.context.WMQInitialContextFactory
jms.provider.url=xx.xxx.xxx.com:1415/xxx.CHANNEL
destination.factory=java:/comp/env/jms/MQConnectionFactory
bm.queue=java:/comp/env/jms/QueueBM
su.queue=java:/comp/env/jms/QueueSU

Spring.xml

   <!--  JMS BEANS  -->   
    <bean id="bmMessageReceiver" class="com.jms.BMMessageReceiver"/> 
    <bean id="suMessageReceiver" class="com.jms.SUMessageReceiver"/>
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">${jms.factory.initial}</prop>
                <prop key="java.naming.provider.url">${jms.provider.url}</prop>
            </props>
        </property>
    </bean>
    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>${destination.factory}</value>
        </property>
    </bean>
    <bean id="bmMessageQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>${bm.queue}</value>
        </property>
    </bean>
    <bean id="suMessageQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>${su.queue}</value>
        </property>
    </bean>
    <bean id="bmListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="5" />
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="bmMessageQueue" />
        <property name="messageListener" ref="bmMessageReceiver" />
        <property name="sessionTransacted" value="true" />
    </bean>
    <bean id="suListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="5" />
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="suMessageQueue" />
        <property name="messageListener" ref="suMessageReceiver" />
        <property name="sessionTransacted" value="true" />
    </bean>    
 <!--    JMS END   --> 
4

1 に答える 1

1

アプリがローカル キューを開くと、承認プロファイルは開かれたキューの名前と一致します。つまり、接続されているアプリLOCALQMGRが開く場合SYSTEM.DEF.LOCAL.QUEUE@LOCALQMGR、 の認可制御リスト エントリはLOCALQMGR、アプリに へのアクセスを許可する必要がありますSYSTEM.DEF.LOCAL.QUEUE

ただし、アプリを開くSOME.QUEUE@REMOTEQMGRと、QMgr が解決REMOTEQMGRされ、その QMgr につながる送信キューが見つかります。この場合にオープンするキューは伝送キューであるため、伝送キューに一致する許可プロファイルを探します。アプリを XMitQ に承認することは問題ありませんが、アプリはコマンド キューなど、その QMgrの任意のキューにメッセージを送信できます。

多くの場合、管理者は、QMgr 上の任意のキューへのアクセスを許可し、むしろそれを制限したいため、伝送キューへの直接アクセスを許可したくありません。そのため、ポイント ツー ポイント インターフェイスでは、ローカルで QRemote をセットアップし、それに対してアプリを承認するのが一般的です。クラスターでは、クラスター化されたキューを介してローカル QAlias をセットアップし、それに許可プロファイルをアタッチするのが一般的です。

これに影響するのは、アプリが接続要求に使用するユーザー ID だけです。QMgr が安全な場合、アプリがこの接続 ID に影響を与えるためにできることは何もありません。MQ 管理者は、チャネル定義に ID を設定するか、IP アドレスまたは SSL 証明書の識別名から ID をマップします。何らかの理由で QMgr が安全でない場合、アプリは API 呼び出しの一部として接続で使用する ID を指定できます。

connection = ConnectionFactory.createConnection(userID, password);

MQ 管理者がMCAUSERチャネルに設定またはマッピングしていない場合、QMgr は提供された ID を受け入れ、パスワードはチェックされません。MQ 管理者がチャネル出口を構成すると、出口は LDDAP、AD、ローカル OS などに対してパスワードを検証できます。ただし、出口がインストールされていない場合、パスワードはチェックされません。

これがわかったので、(私にはできないので)の効果についての質問に答えることができるかもしれsetDirectAuthません。そのパラメーターが接続ファクトリーによって継承され、チャネル要求によってアサートされる場合、MQ に渡され、チャネルが保護されていない場合は受け入れられます。同様に、ID とパスワードを受け取る Connection オブジェクト コンストラクターを使用した場合、チャネルが安全でない場合に QMgr によって受け入れられる ID を確実にアサートできます。

これは、次を使用してテストできます。

connection = ConnectionFactory.createConnection('mqm', 'doesntmatter');

QMgr が UNIX/Linux 上にあり、安全でない場合、アプリは として実行されmqmます。このように実行することはお勧めしません。正しい応答は、それを保護することです。しかし、これは安全かどうかをテストして確認する 1 つの方法です。

于 2012-10-10T16:06:57.507 に答える