Spring-Konfiguration für JMS (Websphere MQ - SSL, Tomcat, JNDI, Nicht IBM JRE)
Hintergrund:
Ich habe eine relativ alte Anwendung, die verwendet Websphere MQ für messaging. Es läuft auf WAS (Websphere Application Server) und nutzt MDBs (Message Driven Beans). Ich war erfolgreich in der Lage, Sie zu ersetzen alle MDBs mit Spring-Integration - JMS. Mein Nächster Schritt ist zu versuchen, um zu sehen, ob ich die Portierung aus WAR, so dass es auf jedem anderen servlet-container mit einer nicht-IBM-JRE (ich bin versucht: apache tomcat). Beachten Sie, dass die Sicherung der Kanäle, die mithilfe von SSL eine Anforderung. Ich bevorzuge die Verwendung von JNDI.
Ziel:
Zur Entkopplung von meiner Applikation aus der application server (was) und andere Infrastrukturen wie messaging (MQ). Aber dies WAR auf tomcat ist der erste Schritt. Als Nächstes kommt die Aufgabe der Aktualisierung meines messaging-Infrastruktur mit etwas mehr skalierbar. Dies ermöglicht es mir, update einzelner Komponenten der Infrastruktur, die meine app setzt auf, eine Sache zu einer Zeit (app-server, messaging-Ebene, datastore) ohne Unterbrechung für meine Anwendung zu viel, wie ich gehen.
Frage:
Nun, meine Herausforderung ist die Definition der JNDI-Ressourcen an tomcat Zugriff auf Websphere MQ. Ich habe einige Fortschritte in Bezug auf diese Verwendung von nicht-SSL-Kanäle, die ich definiert context.xml Datei etwa so:
<Resource
name="jms/qcf_sandbox"
auth="Container"
type="com.ibm.mq.jms.MQQueueConnectionFactory"
factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
description="JMS Queue Connection Factory for sending messages"
HOST="localhost"
PORT="1414"
CHAN="CHANNEL_SANDBOX"
TRAN="1"
QMGR="QM_SANDBOX"/>
<Resource
name="jms/SandboxQ"
auth="Container"
type="com.ibm.mq.jms.MQQueue"
factory="com.ibm.mq.jms.MQQueueFactory"
description="JMS Queue"
QU="SANDBOX_Q"/>
Mein Nächster Schritt ist, um diese zum arbeiten mit SSL-Kanäle. Ich verstehe, dass der Teil umfasst das einrichten der keystores (kdb-Datei und cert-generation und Austausch), das konfigurieren des SSL-Kanäle auf der QM-etc. Ich habe alle, die arbeiten schon. Wie bekomme ich tomcat verwenden, meine keystore -, cipher-suite etc.? Zeiger oder ein funktionierendes Beispiel wäre toll!
Hinweis: ich bin mit Spring Integration 4.2, Websphere MQ v8, Tomcat v9, aktuell.
Muss ich hinzufügen, dass ich habe versucht, alles ohne den JNDI-ersten. Also hier mein spring jms nicht-ssl-config-ohne JNDI, das funktioniert:
<bean id="mq-jms-cf-sandbox"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory">
<ref bean="mqQueueConnectionFactory" />
</property>
</bean>
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="1414" />
<property name="queueManager" value="QM_SANDBOX" />
<property name="transportType" value="1" />
<property name="channel" value="CHANNEL_SANDBOX" />
</bean>
<bean id="jms-destination-sandbox" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="SANDBOX_Q" />
<property name="baseQueueManagerName">
<value>QM_SANDBOX</value>
</property>
<property name="baseQueueName">
<value>SANDBOX_Q</value>
</property>
</bean>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass ich endlich herausgefunden, wie man dieses Weg zu ziehen... hier ist eine kurze Beschreibung der Schritte. Wenn Sie weitere Einzelheiten benötigen, lassen Sie es mich wissen.
Pre-reqs:
Websphere MQ-Server installiert ist (mindestens v 8.0.0.2)
Konfigurieren Sie das QM -, SSL-und nicht-SSL-Kanäle, erstellen von Qs-und all das gute Zeug, die Sie benötigen.
Unnötig zu sagen, Sie müssen die Websphere MQ-Gläser. Darauf achten, keine Zulassungsbeschränkungen.
Schritt 1: Holen Sie sich die direkte Verbindung ohne SSL, keine JNDI. Sie verwenden müssen, diese Bohnen zu konfigurieren, spring-basierte JMS-Listener-und JMS-Vorlagen etc.
Schritt 2: Holen Sie sich die direkte Verbindung mit SSL, keine JNDI. Ich fand die Einstellung ein wenig schwierig.
2a. Da ich mit einem nicht-IBM-JRE, die ich hatte, um sicherzustellen, dass die cipher-specs & cipher-suites konfiguriert werden musste entsprechend der Zuordnungen, die hier angegeben:
http://www-01.ibm.com/support/docview.wss?uid=swg1IV66840
Dies bedeutet natürlich, dass wir zumindest haben unseren Websphere MQ aktualisiert 8.0.0.2. In meinem Fall habe ich ECDHE_RSA_AES_256_GCM_SHA384 auf den SSL-Kanal und der Konfiguration des jms-Bohnen innerhalb einer Anwendung zu verwenden TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, etwa so:
2b. Erstellen Sie Zertifikate, keystores (kdbs), exchange, Zertifikate etc. Es gibt viele Möglichkeiten, dies zu tun. Aber bewusst sein, dass Sie brauchen, zu verstauen Passwörter, Schlüssel label für den queue manager muss 'ibmwebspheremqqmgr' – alles in Kleinbuchstaben, keine Leerzeichen (ohne Anführungszeichen), das Schlüssel-label sein muss, wie 'ibmwebspheremquserid' – alles in Kleinbuchstaben, keine Leerzeichen (ohne Anführungszeichen), wo die userid ist die userid, das läuft tomcat. Wenn Sie brauchen mehr details, wie genau habe ich es mit self-signed certs, lass es mich wissen.
2c. Jetzt haben Sie, um die JVM, dass tomcat ausgeführt wird, Lesen Sie Ihr-keystores. Es gibt viele Möglichkeiten, aber hier ist, wie ich es gemacht habe:
Erstellen Sie eine setenv.bat-Datei in den tomcat-bin-Ordner, mit folgendem Inhalt (Debuggen von SSL ist optional)
2d. Starten Sie tomcat mit dem folgenden Befehl:
Stoppen, drücken Sie einfach Strg+c (bei windows). Egal welchen Weg Sie es tun, stellen Sie sicher, dass setenv.bat verwendet wird, während der start-up. Oder verwenden Sie JAVA_OPTS zum festlegen der keystore-Eigenschaften.
2e. Stellen Sie sicher, dass die Verwendung des SSL-Kanals arbeitet.
Schritt 3: Holen Sie sich eine JNDI-Verbindung mit nicht-SSL, JNDI
Es gibt viele, war die Einrichtung JNDI auf tomcat. Hier ist, wie ich es gemacht habe: Innerhalb der web-Anwendung eine Datei erstellen META-INF/Context.xml mit folgendem Inhalt:
Nun in der spring-config, statt der direkten Konfigurationen, alles, was Sie tun müssen, ist:
Beachten Sie, dass für die Kürze, ich wollte nur nicht, verwenden Sie Ressourcen-Referenzen. Falls Sie das tun, gibt es ein paar zusätzliche Schritte, die sich gerade nach vorne.
Schritt 4: Nun der Letzte Schritt ist die Verwendung eines SSL-Kanal und JNDI. Vorausgesetzt, Sie haben getan, Schritt 2, das ist einfach. Ändern Sie die META-INF/Context.xml mit folgendem Inhalt:
Beachten Sie die Zeile mit SCPHS="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384". Wenn Sie brauchen, um stellen Sie die anderen Parameter finden Sie in der "Kurzen Form" Spalte in diesem link:
https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.dev.doc/q111800_.htm%23jm10910_?lang=en
Hoffentlich alle diese arbeiten für Sie. Viel Glück!
Einmal diese Konfiguration funktioniert, das senden von Nachrichten ist ziemlich straight-forward. Aber dies ist, wie Sie hören eine Nachricht auf einer queue mit Spring JMS
Referenz: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html
Schritt 1: Verwenden Sie Spring DefaultMessageListenerContainer und konfigurieren Sie Ihre beans in einer xml-Datei so (spring-beans.xml):
Schritt 2: Fügen Sie diese zu Ihrem web.xml
Schritt 3: Schreiben Sie eine Nachricht Listener-Klasse in etwa so:
Alternativ, anstelle von Schritt 3, wenn Sie mit spring integration, können Sie etwas wie das tun: