Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 如何使用SSL连接从驼峰路由连接到IBM MQ?_Apache Camel_Ibm Mq - Fatal编程技术网

Apache camel 如何使用SSL连接从驼峰路由连接到IBM MQ?

Apache camel 如何使用SSL连接从驼峰路由连接到IBM MQ?,apache-camel,ibm-mq,Apache Camel,Ibm Mq,我可以通过驼峰路由成功连接到IBMMQ并初始化连接工厂bean,但现在我想使用SSL连接 我在服务器端为队列管理器创建密钥存储,创建证书并将其添加到其中 我在客户端创建了一个信任存储,并将证书添加到其中 现在我希望MQ连接工厂在连接到服务器时引用信任存储 以下是我尝试过的: <bean id="MyConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> <property name=

我可以通过驼峰路由成功连接到IBMMQ并初始化连接工厂bean,但现在我想使用SSL连接

  • 我在服务器端为队列管理器创建密钥存储,创建证书并将其添加到其中
  • 我在客户端创建了一个信任存储,并将证书添加到其中
  • 现在我希望MQ连接工厂在连接到服务器时引用信任存储
  • 以下是我尝试过的:

    <bean id="MyConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="transportType" value="${queue.transportType}" />
            <property name="channel" value="${queue.channel}" />
            <property name="hostName" value="${queue.hostName}" />
            <property name="port" value="${queue.port}" />
            <property name="queueManager" value="${queue.manager}" />
            <property name="sSLCipherSuite" value="SSL_RSA_WITH_NULL_MD5" />
            <property name="sSLCertStores" value="file:C:/Servers/TrustStore/truststore.jks" />
        </bean>
    

    有人能告诉我怎么做吗?

    从安全角度来看,客户端应该只接收可能与许多问题有关的一般错误消息。找出客户机被拒绝的确切原因的最佳位置是队列管理器日志。我建议您查看一下,看看是否有任何错误可以帮助您进一步确定问题。 根据给出的信息,我可以想到3个问题:

  • 队列管理器通道设置了SSLCAUTH(必需)属性,但是根据您在此处给出的描述,客户端似乎没有使用自己的证书进行连接。SSLCAUTH(必需)意味着队列管理器将只接受客户机使用其信任的证书连接的特定通道上的连接。检查频道定义并设置SSLCAUTH(可选)

  • 根据您的IBM MQ版本,您使用的密码规范(SSL_RSA_WITH_NULL_MD5)被视为弱密码,默认情况下不会被接受。您可以重新启用这些不推荐使用的密码规范,有关如何重新启用密码规范的说明可以在

  • 客户端未拾取信任库“C:/Servers/truststore/truststore.jks”,因此客户端无法信任队列管理器的证书。仔细检查您提供的路径并删除您添加到路径中的“文件:”文件(除非特别指示您将其包括在内)


  • 您没有说明正在使用哪个版本的IBM MQ或什么JRE,如果它不是IBM MQ的最新版本,并且正在与Oracle JRE一起使用,则APAR可能会在这里有所帮助

    在Tom Leend发布的IBM developerWorks博客“”的末尾,有一篇关于上述APAR的好文章。他为没有此修复程序的Java客户机提供了一个解决方案

    我还要提到最后一个APAR,那就是IT10837(针对V7.1.0.8和V7.5.0.7,在V8.0.0.5中提供)。此APAR影响在Oracle JRE中运行的应用程序,这些应用程序使用TLS CipherSuite连接到队列管理器,其中正在使用的服务器连接通道将SSLCAUTH属性设置为“必需”(默认值)。这意味着客户端应将证书传递给队列管理器,以便MQ服务器可以对连接的客户端进行身份验证

    当应用程序在Oracle JRE中运行时,SunJSSE提供程序没有为TLS套接字连接创建默认的内部密钥管理器对象,这意味着在握手期间客户端的已签名个人证书不可用于客户端身份验证。IBM JSSE提供程序根据通过Java系统属性传递的信息执行此操作:

    • javax.net.ssl.keyStore

    • javax.net.ssl.keystrepassword

    由于默认情况下未创建KeyManager对象,因此客户端证书未传递给队列管理器(GSKit)进行身份验证。因此,来自应用程序的连接将失败。在此场景中,队列管理器会将以下错误消息写入其错误日志文件:

    AMQ9637(频道缺少证书)

    此APAR的修复程序是,MQ classes for JMS和classes for Java根据上述两个Java系统属性中的信息读取证书密钥库,并在JVM中将com.ibm.MQ.cfg.useIBMCipherMappings设置为值false时,基于该信息创建密钥管理器。然后,在创建SSLContext时可以使用它(随后将使用它创建SSLSocketFactory并最终创建安全套接字对象)

    有一个本地解决方案供应用程序自己创建 信任适当证书存储区的ManagerFactory和KeyManagerFactory工厂对象,并初始化这些对象的SSLContext对象。从该SSLContext对象和SSLSocketFactory可以创建并传递给JMS的MQ类(通过在JMS连接工厂上设置它)或Java的类(通过在MQEnvironment上或传递给MQQueueManager构造函数的哈希表中设置它)。例如:

    ----代码段开始----

    ----代码段结束----


    我建议查阅有关这些MQ错误代码的IBM MQ文档。IBM必须在某个地方有文档,它们的意思可能是有帮助的:您找到问题的解决方案了吗?如果是,请让我们知道如何让其他有同样问题的人受益。
    JMSWMQ0018: Failed to connect to queue manager 'QM_TEST_SSL' 
           with connection mode 'Client' and host name '10.3.13.161(1415)'.; 
           nested exception is com.ibm.mq.MQException: JMSCMQ0001: 
           WebSphere MQ call failed with compcode '2' ('MQCC_FAILED')
           reason '2397' ('MQRC_JSSE_ERROR').
    
    KeyStore keyStore = KeyStore.getInstance("JKS");
    java.io.FileInputStream keyStoreInputStream = new java.io.FileInputStream("/home/tom/myKeyStore.jks");
    keyStore.load (keyStoreInputStream, password_char_array);
    
    KeyStore trustStore trustStore = KeyStore.getInstance ("JKS");
    java.io.FileInputStream trustStoreInputStream = new java.io.FileInputStream("/home/tom/myTrustStore.jks");
    trustStore.load (trustStoreInputStream, password_char_array);
    
    keyStoreInputStream.close();
    trustStoreInputStream.close();
    
    KeyManagerFactory keyManagerFactory = 
      KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    TrustManagerFactory trustManagerFactory = 
      TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    keyManagerFactory.init(keyStore,password);
    trustManagerFactory.init(trustStore);
    
    SSLContext sslContext = SSLContext.getInstance("TLSv1"); 
    sslContext.init(keyManagerFactory.getKeyManagers(), 
      trustManagerFactory.getTrustManagers(), 
      null);
    SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 
    
    // classes for JMS
    myJmsConnectionFactory.setObjectProperty(
      WMQConstants.WMQ_SSL_SOCKET_FACTORY, sslSocketFactory);
    
    // classes for Java
    MQEnvironment.sslSocketFactory = sslSocketFactory;