15

Java 経由で Websphere 6.0 MQ に接続したいと考えています。「通常の」キューのコードは既に動作していますが、SSL で暗号化された新しいキュー (キーストア) にアクセスする必要があります。something.jks というファイルが送られてきました。これは、どこかに保存する必要がある証明書だと思います。ネットで調べてみましたが、正しい情報が見つかりません。

これは、「通常の」キューに使用するコードです。いくつかのプロパティを設定する必要があると思いますが、どのプロパティかわかりません。

MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setChannel(channel_);
connectionFactory.setHostName(hostname_);
connectionFactory.setPort(port_);
connectionFactory.setQueueManager(queueManager_);
connectionFactory.setTransportType(1);
connectionFactory.setSSsetSSLCertStores(arg0)

Connection connection = connectionFactory.createConnection();
connection.setExceptionListener(this);
session_ = connection.createSession(DEFAULT_TRANSACTED, DEFAULT_ACKMODE);
connection.start();

javax.jms.Queue fQueue = session_.createQueue(queue_);
consumer = session_.createConsumer(fQueue);
4

4 に答える 4

14

developerWorks の Alex Fehners のチュートリアルは少し古い (2005 年) ですが、コード サンプルが含まれているので、役に立つはずです。

Websphere MQ Java/JMS クライアントの SSL 構成

Java アプリは、その証明書に基づいて QMgr を認証します。つまり、提供された jks ファイルには、QMgr の自己署名証明書が含まれているか、QMgr の証明書に署名した認証局のルート証明書が含まれている必要があります。いずれの場合も、-Djavax.net.ssl.trustStore=<location of trustStore>上記のリンク先の記事に記載されているように、 を使用してファイルを指定します。jks にパスワードがある場合は、パスワードも指定する必要があります-Djavax.net.ssl.trustStorePassword=<password>。トラストストアを使用した QMgr の認証は常に必要です。次の部分は、必要な場合と必要でない場合があります。

パズルのもう 1 つのピースは、QMgr がアプリに証明書の提示を要求する可能性があることです。つまり、QMgr 証明書は常に認証され、アプリの認証が必要かどうかはオプションです。そうであれば、「相互認証」と呼ばれるものがあります。接続先のチャネルが構成されている場合、SSLCAUTH(REQUIRED)相互認証が有効になっており、QMgr のキーストアにアプリケーションの自己署名証明書またはアプリの証明書に署名した CA ルート証明書が必要です。あなたの jks ファイルを設定した人は誰でも、すでにこれを手配していることを願っています。

相互認証が必要であると仮定すると、jks は、QMgr の信頼できる証明書に加えて、アプリケーションを表すプライベート証明書を持ちます。アプリに証明書を取得して QMgr に提示させるには、パラメーター-Djavax.net.ssl.keyStore=<location of keyStore>-Djavax.net.ssl.keyStorePassword=<password>パラメーターを使用します。前の parms がトラストストアと言うのに対し、これらはキーストアと言うことに注意してください。

WMQ 管理者と協力して、SSL 接続のセットアップとテストを行うことをお勧めします。最初のフェーズは、 でチャネルをテストすることSSLCAUTH(OPTIONAL)です。これにより、アプリケーションが QMgr の証明書を解決および認証できることが確認されます。これが機能するようになった場合にのみ、WMQ 管理者はSSLCAUTH(REQUIRED)認証を逆方向にテストするチャネルを変更します。

新しいアプリケーションには WMQ v7 クライアントを使用することを強くお勧めします。これには 2 つの理由があります。1) v6 は 2011 年 9 月にサポートが終了しました。2) v7 コードには、より多くの診断機能が組み込まれています。v7 クライアント コードは、v6 QMgr と完全に互換性があり、v6 クライアントのように動作します。v7 の機能を利用できないだけです。ここから WMQ クライアント コードを無料でダウンロードします。

IBM - MQC7: WebSphere MQ V7.0 クライアント

私は今年、IMPACT で WMQ ハンズオン セキュリティ ラボを運営しており、スクリプトとラボ ガイドを週末にhttp://t-rob.netに投稿する予定です。

于 2010-04-22T20:24:35.293 に答える
5

証明書に関する T.Robs の説明とともに、このコードを試してください。

import com.ibm.mq.jms.*;

import java.io.FileInputStream;
import java.io.Console;
import java.security.*;

import javax.jms.JMSException;
import javax.jms.QueueConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import com.ibm.mq.jms.MQQueueConnectionFactory;

public class SSLTest {

   public static void main(String[] args) {
      System.out.println(System.getProperty("java.home"));

      String HOSTNAME = "myhost";
      String QMGRNAME = "MyQMGR";
      String CHANNEL = "MY.SVRCONN";
      String SSLCIPHERSUITE = "TLS_RSA_WITH_AES_256_CBC_SHA";

      try {
         Class.forName("com.sun.net.ssl.internal.ssl.Provider");

         System.out.println("JSSE is installed correctly!");

         Console console = System.console();
         char[] KSPW = console.readPassword("Enter keystore password: ");

         // instantiate a KeyStore with type JKS
         KeyStore ks = KeyStore.getInstance("JKS");
         // load the contents of the KeyStore
         ks.load(new FileInputStream("/home/hudo/hugo.jks"), KSPW);
         System.out.println("Number of keys on JKS: "
               + Integer.toString(ks.size()));

         // Create a keystore object for the truststore
         KeyStore trustStore = KeyStore.getInstance("JKS");
         // Open our file and read the truststore (no password)
         trustStore.load(new FileInputStream("/home/xwgztu2/xwgztu2.jks"), null);

         // Create a default trust and key manager
         TrustManagerFactory trustManagerFactory =
           TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
         KeyManagerFactory keyManagerFactory =
           KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

         // Initialise the managers
         trustManagerFactory.init(trustStore);
         keyManagerFactory.init(ks,KSPW);

         // Get an SSL context.
         // Note: not all providers support all CipherSuites. But the
         // "SSL_RSA_WITH_3DES_EDE_CBC_SHA" CipherSuite is supported on both SunJSSE
         // and IBMJSSE2 providers

         // Accessing available algorithm/protocol in the SunJSSE provider
         // see http://java.sun.com/javase/6/docs/technotes/guides/security/SunProviders.html
         SSLContext sslContext = SSLContext.getInstance("SSLv3");

         // Acessing available algorithm/protocol in the IBMJSSE2 provider
         // see http://www.ibm.com/developerworks/java/jdk/security/142/secguides/jsse2docs/JSSE2RefGuide.html
         // SSLContext sslContext = SSLContext.getInstance("SSL_TLS");
          System.out.println("SSLContext provider: " +
                            sslContext.getProvider().toString());

         // Initialise our SSL context from the key/trust managers
         sslContext.init(keyManagerFactory.getKeyManagers(),
                         trustManagerFactory.getTrustManagers(), null);

         // Get an SSLSocketFactory to pass to WMQ
         SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

         // Create default MQ connection factory
         MQQueueConnectionFactory factory = new MQQueueConnectionFactory();

         // Customize the factory
         factory.setSSLSocketFactory(sslSocketFactory);
         // Use javac SSLTest.java -Xlint:deprecation
         factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
         factory.setQueueManager(QMGRNAME);
         factory.setHostName(HOSTNAME);
         factory.setChannel(CHANNEL);
         factory.setPort(1414);
         factory.setSSLFipsRequired(false);
         factory.setSSLCipherSuite(SSLCIPHERSUITE);

         QueueConnection connection = null;
         connection = factory.createQueueConnection("",""); //empty user, pass to avoid MQJMS2013 messages
         connection.start();
         System.out.println("JMS SSL client connection started!");
         connection.close();

      } catch (JMSException ex) {
         ex.printStackTrace();
      } catch (Exception ex){
         ex.printStackTrace();
      }
   }
}
于 2014-09-18T07:18:47.717 に答える
4

使用している JRE に注意してください。IBM MQ への SSL チャネルでの特定の暗号化 (TLS_RSA_WITH_AES_128_CBC_SHA) が原因で、Sun JDK の使用に大きな問題がありました。X509 証明書を使用しました。それを機能させるために、IBM JRE を使用しています。これは、特定の暗号スイートをより強力にサポートするためです。

于 2011-07-16T00:23:07.700 に答える