【问题标题】:Error while using SSL in MQ java client在 MQ Java 客户端中使用 SSL 时出错
【发布时间】:2018-04-25 11:15:20
【问题描述】:

我使用 IBM MQ V7.5 客户端并运行 Java 1.7 编写了一个带有 SSL 配置的 Java 客户端。为此,我参考了 SSL configuration of the Websphere MQ Java/JMS client,但在 Create TrustStore 步骤 8 中,我使用了自签名证书。 (因为我没有 CA 的证书,我在哪里获得 CA 的证书?)

我的客户端 Java 代码是

import com.ibm.mq.*;
import com.ibm.mq.constants.MQConstants;

public class MQProducer {
private static final String qManager = "QM1";
private static final String qName = "localq";
private static final String truloc = "C:\\Program Files (x86)\\IBM\\WebSphere MQ\\Qmgrs\\QM1\\ssl\\trustStore.jks";
private static final String keyloc = "C:\\Program Files (x86)\\IBM\\WebSphere MQ\\Qmgrs\\QM1\\ssl\\keyStore.jks";

public static void main(String args[]) {
    try {
        MQEnvironment.hostname = "192.168.43.5";
        MQEnvironment.channel = "myChannel";
        MQEnvironment.port = 1414;
        MQEnvironment.userID = "Taneesha";

        System.setProperty("javax.net.ssl.trustStore", truloc);
        System.setProperty("javax.net.ssl.keyStore", keyloc);
        System.setProperty("javax.net.ssl.keyStorePassword", "123456");
        MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_NULL_MD5";

        MQQueueManager qMgr = new MQQueueManager(qManager);
        int openOptions = MQConstants.MQOO_OUTPUT;
        MQQueue queue = qMgr.accessQueue(qName, openOptions);

        MQMessage msg = new MQMessage();
        String message = "Hello world";
        msg.writeUTF(message);
        MQPutMessageOptions pmo = new MQPutMessageOptions();
        queue.put(msg, pmo);

        queue.close();
        qMgr.disconnect();
    } catch (MQException ex) {
        ex.printStackTrace();
        System.out.println("A WebSphere MQ Error occurred : Completion Code " + ex.completionCode
                + " Reason Code " + ex.reasonCode);
    } catch (java.io.IOException ex) {
        System.out.println("An IOException occurred whilst writing to the message buffer: " + ex);
    }
  }
}

我收到以下错误

MQJE001: Completion Code '2', Reason '2397'.
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;
AMQ9204: Connection to host '192.168.43.5(1414)' rejected. 
         [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2397;
AMQ9771: SSL handshake failed. 
         [1=javax.net.ssl.SSLHandshakeException[No appropriate protocol 
         (protocol is disabled or cipher suites are inappropriate)],
         3=kasun-PC/192.168.43.5:1414 (kasun-PC),
         4=SSLSocket.startHandshake,
         5=default]],
         3=192.168.43.5(1414),
         5=RemoteTCPConnection.protocolConnect]

请有人帮忙吗?

【问题讨论】:

  • 我正在使用 MQ V7.5 并运行 java 1.7

标签: ssl ibm-mq


【解决方案1】:

MQ qmgr 和客户端版本是什么?什么是 Java/JDK 版本? 如果您使用的是最新版本的 Java 7 或任何版本的 Java 8,则您使用的 SSL 密码已被禁用/停用。使用 TLS 密码。

编辑

MQ 7.5 支持的密码套件列表位于http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q031290_.htm?lang=en 您可以尝试任何密码规范以 TLS 开头的密码套件。确保 qmgr 上的 svrconn 通道也使用正确的密码规范进行了更新。

如果您只是在本地机器上试用 MQ 并想摆脱它,请在 jvm 上启用 SSL 协议。 http://www.oracle.com/technetwork/java/javase/7u75-relnotes-2389086.html 查找 /lib/security/java.security 并注释/删除 jdk.tls.disabledAlgorithms(通常是最后一行)。

作为永久性修复,您应该使用 TLS 而不是 SSL,因为它们存在安全风险。

【讨论】:

    【解决方案2】:

    首先,请看我的回答SSL connect to MQ using .net mq client SSLV3?,我在其中提供了一个 SSL 实现过程,使过程更加更容易。

    在这种情况下,虽然错误消息揭示了问题:

    No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
    

    正如 Umpathy 在他的回答中指出的那样,这通常是由于在 QMgr 中选择了默认情况下不再支持的密码套件。虽然可以选择通道和客户端中的设置,但 QMgr 将根据SSLFIPSSSLSUITEB、环境变量或qm.ini 文件中的 SSL 节的设置拒绝使用它。请参阅 CipherSpec values supported in IBM MQ 了解最新支持的密码以及如何启用已弃用的密码。

    你还问因为我没有 CA 的证书,我在哪里获得 CA 的证书?

    选择使用自签名证书与您能否找到给定证书的 CA 签名者无关。如果连接的任一端使用 CA 签名证书,则另一端必须在其信任库或 kdb 中有该证书的签名者,即使其个人证书是自签名。

    如果任何一方使用 CA 签名证书,有几种方法可以找到签名者。

    • 最佳方法是获取您需要签名者的证书并转储详细信息。 Issuer Distinguished Name 将告诉您使用了哪个签名者。如果证书来自信誉良好的 CA,它很可能还会包含指向签名者证书权威来源的 URL。
    • 第二种最佳方法是要求管理远程节点的一方查看 kdb 或 jks 并提取用于其个人证书的签名者证书。这仅适用于受信任方,因为您接受签名者证书的任何人都与真正的 CA 一样受信任。但是,如果远程节点是由您自己组织中的某个人管理的 QMgr,您通常可以信任他们提供合法的签名者证书。

    终于……
    请注意,如果您使用自签名证书,另一方必须将您的公钥添加到他们的 kdb 或 jks 以便您连接。目前双方无法就协议达成一致,但一旦达成一致,他们将验证彼此的证书。那时我在上面的链接中提供的调试过程应该证明非常很有帮助。

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2015-06-13
      • 2017-10-04
      相关资源
      最近更新 更多