2015-10-13 129 views
0

我有下面的代碼,它連接到IBM Websphere MQ,它沒有SSL,沒有問題並且能夠放置/獲取消息。但是當我嘗試使用SSL連接MQ時,出現錯誤。使用java的Websphere MQ SSL連接

請注意,patch()方法將禁用SSL,該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); 
} 

} 

回答

1

最簡單的方法是不要把它放在您的代碼中,而是使用客戶端通道定義表(CCDT)。然後,您可以在沒有SSL的情況下使用它,稍後將CCDT更改爲使用SSL,而無需更改您的代碼。這被認爲是客戶端連接到IBM MQ的最佳實踐。

這意味着您不再使用MQEnvironment類來傳遞通道名稱,主機名等內容,而是使用帶有兩個參數的稍微不同的構造函數,第一個是先前的隊列管理器名稱,第二個是您的CCDT文件的名稱。

你可以閱讀更多有關如何在官方IBM MQ知識中心與Java使用CCDT下面的頁面還包括一​​個鏈接,如何創建CCDT文件: -

+0

我無法創建CCDT文件,因爲我無法訪問wmq環境。我問過我的MQ團隊並等待回覆。但是,我有一個由證書小組提供的.kdb文件(密鑰數據庫文件?),他們說這應該起作用。任何想法如何使用kdb文件和創建mq連接? –

+0

您可以在客戶機上創建CCDT。 –