【问题标题】:Websphere MQ SSL connection using java使用 java 的 Websphere MQ SSL 连接
【发布时间】:2015-10-13 15:09:05
【问题描述】:

我下面的代码连接到没有 SSL 且能够放置/获取消息的 IBM Websphere MQ。但是当我尝试使用 SSL 连接 MQ 时,我遇到了错误。

请注意,patch() 方法是禁用 SSL,它会被执行但不会禁用 SSL。

除了这个,你能告诉我如何连接到启用 SSL 通道的 MQ。

注意 - 我有证书文件,例如 - key.kdb、key.crl、key.rdb、key.sth 和其他一些 CA3、CA4.cer 文件。如何安装它们并在我的代码中使用它?

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.*;

import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Hashtable;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class mq1 {

public static String    host = "localhost";
public static int       port = 1414;
public static String    strchannel = "MQ.CHL";
public static String    strqueuemanager = "MQMGR";
public static String    strqueue = "REQUEST.QUEUE";

@SuppressWarnings("deprecation")
public static void main(String[] args) throws KeyManagementException, NoSuchAlgorithmException {
//call patch() to skip SSL 
patch();

int openOptions = CMQC.MQOO_BROWSE | CMQC.MQOO_INQUIRE | CMQC.MQOO_OUTPUT | CMQC.MQOO_INPUT_AS_Q_DEF ;

MQEnvironment.hostname = host;
MQEnvironment.port = port;
MQEnvironment.channel = strchannel;
MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY,CMQC.TRANSPORT_MQSERIES);

MQQueueManager qMgr;
try {
qMgr = new MQQueueManager (strqueuemanager);
System.out.println(qMgr);
MQQueue destQueue = qMgr.accessQueue(strqueue, openOptions);
System.out.println("Queue size:" + destQueue.getCurrentDepth()); 
MQMessage hello_world = new MQMessage(); 
System.out.println("MQMessage message created");
hello_world.writeUTF("Sending Sample message"); 
MQPutMessageOptions pmo = new MQPutMessageOptions();
try {
destQueue.put(hello_world,pmo);
destQueue.get(hello_world);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}

int len = hello_world.getDataLength();
System.out.println("Length : " + len);
System.out.println("GET: "+ hello_world.readString(len-1));
destQueue.close();
qMgr.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}


public static void patch() throws KeyManagementException, NoSuchAlgorithmException {

System.out.println("Calling SSL patch");

TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}

public void checkClientTrusted(X509Certificate[] certs, String authType) {
}

public void checkServerTrusted(X509Certificate[] certs, String authType) {
}

}
};

System.out.println("trustAllCerts = "+trustAllCerts);

SSLContext sc = SSLContext.getInstance("SSL");

System.out.println("sc before init = "+sc);

sc.init(
null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession session) {
return true;
}
};

System.out.println("sc after init= "+sc);
System.out.println("allHostsValid= "+allHostsValid);
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}

}

【问题讨论】:

    标签: java ssl ibm-mq mq


    【解决方案1】:

    最简单的方法是根本不将其放入您的代码中,而是使用客户端通道定义表 (CCDT)。然后您可以在没有 SSL 的情况下使用它,然后将 CCDT 更改为使用 SSL,而无需更改您的代码。这被认为是客户端连接到 IBM MQ 的最佳实践。

    这意味着您将停止使用MQEnvironment 类来传递通道名称、主机名等内容,而是使用稍微不同的MQQueueManager 构造函数,其中包含两个参数,第一个是队列管理器名称,如前所述,第二个是您的 CCDT 文件的名称。

    您可以在以下页面的官方 IBM MQ 知识中心中阅读有关如何将 CCDT 与 Java 一起使用的更多信息,其中还包含指向如何创建 CCDT 文件的链接:-

    【讨论】:

    • 我无法创建 CCDT 文件,因为我无权访问 wmq 环境。我已经询问了我的 MQ 团队并等待回复。但是,我有一个证书团队提供的 .kdb 文件(密钥数据库文件?),他们说应该可以。关于如何使用 kdb 文件和创建 mq 连接的任何想法?
    • 您可以在客户端机器上创建一个CCDT。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2012-09-10
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2015-08-26
    相关资源
    最近更新 更多