我能够使用不安全的通道与QManager建立连接,并且能够做我想做的事情。
但现在我正试图通过安全通道连接到同一个QManage;我从MQ服务器生成了安全密钥(公钥和私钥),但我不确定如何合并密钥并建立MQ连接。
我用Google搜索并找到了一些答案,其中提出了以下方法,但它无效。
System.setProperty("javax.net.ssl.trustStore","path to public key");
System.setProperty("javax.net.ssl.keyStore","path to private key");
我得到了例外。
com.ibm.mq.MQException : MQJE001: Completion Code '2', Reason '2537'.
我很感激有关如何使用安全密钥连接到QManager的一些指导或示例代码。
@JoshMc - 请在下面的问题中找到答案
您是使用IBM MQ Classes for Java还是IBM MQ Classes for JMS? 我正在使用IBM MQ Classes for Java
您使用的jar文件是哪个版本的IBM MQ?
第7版
您尝试连接的队列管理器是哪个版本的MQ?
版本8
您是否尝试让MQ验证客户端证书(检查SVRCONN通道上SSLCAUTH的值)
是。我有MQ管理员从MQ服务器生成的公钥和私钥(我无权访问MQ服务器),需要使用它来连接MQ服务器。
粘贴尝试连接时显示在队列管理器AMQERR01.LOG中的所有错误。
我无法访问日志文件。
以下是工作代码;我能够连接到不安全的频道并发送消息
public void MQSender(){
MQQueueManager QMgr = null;
try {
MQEnvironment.hostname = "hostname";
MQEnvironment.channel = "UNSECURE";
//MQEnvironment.channel = "SECURE";
MQEnvironment.port = 8080;
QMgr = new MQQueueManager("QManager");
int openOptions = MQConstants.MQOO_OUTPUT;
MQQueue queue = QMgr.accessQueue("QNAME",openOptions);
MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options = MQConstants.MQPMO_LOGICAL_ORDER | MQConstants.MQPMO_SYNCPOINT;
MQMessage message = new MQMessage();
message.writeString("TEST");
queue.put(message, pmo);
QMgr.commit();
} catch (Exception e) {
if(QMgr!=null){
try {
QMgr.backout();
} catch (MQException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
答案 0 :(得分:1)
您缺少指定要在代码中使用的密码套件的选项: MQEnvironment.sslCipherSuite
此知识中心文章可能有所帮助:https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q031220_.htm
您是否在JKS商店拥有值得信赖的证书和私人证书/密钥对? 这些应该更像是:
System.setProperty(" javax.net.ssl.trustStore"," JKS文件的路径,包含验证服务器证书所需的证书");
System.setProperty(" javax.net.ssl.keyStore"," JKS文件的路径,包含客户端的证书和私钥");