在MQ java客户端中使用SSL时出错

时间:2015-11-15 09:24:08

标签: ssl ibm-mq

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

我的客户端Java代码是

DECLARE @ipaddress varbinary(16) = dbo.TryParseIPAddress( N'2001:0db8:85a3:0000:0000:8a2e:0370:7334')

SELECT *
FROM CityIp
WHERE
    dbo.TryParseIPAddress(IpStart) <= @ipaddress
    AND dbo.TryParseIPAddress(IpEnd) >= @ipaddress

我收到以下错误

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);
    }
  }
}

请有人帮忙吗?

2 个答案:

答案 0 :(得分:0)

什么是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,因为它们存在安全风险。

答案 1 :(得分:0)

首先,请参阅我的回答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,环境变量或{{{中的SSL节'的设置拒绝使用它。 1}}文件。有关支持哪些密码以及如何启用已弃用的密码的最新信息,请参阅 CipherSpec values supported in IBM MQ

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

使用自签名证书的选择不在于您是否可以找到给定证书的CA签名者。如果连接的任何一方使用CA签名证书,则另一方 必须 在其信任存储区或kdb中拥有该证书的签名者,即使其个人证书是自签名。

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

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

...最后
请注意,如果您使用的是自签名证书,则另一方必须将您的公钥添加到其kdb或jks中才能进行连接。目前,双方无法就协议达成一致,但一旦他们这样做,他们就会相互验证协议。证书。此时,我在上面的链接中提供的调试程序应证明非常有帮助。