我使用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);
}
}
}
请有人帮忙吗?
答案 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将根据SSLFIPS
,SSLSUITEB
,环境变量或{{{中的SSL节'的设置拒绝使用它。 1}}文件。有关支持哪些密码以及如何启用已弃用的密码的最新信息,请参阅 CipherSpec values supported in IBM MQ 。
您还问因为我没有CA的证书,我在哪里获得CA的证书?
使用自签名证书的选择不在于您是否可以找到给定证书的CA签名者。如果连接的任何一方使用CA签名证书,则另一方 必须 在其信任存储区或kdb中拥有该证书的签名者,即使其个人证书是自签名。
如果任何一方使用CA签名证书,有几种方法可以找到签名者。
qm.ini
将告诉您使用了哪个签名者。如果证书来自信誉良好的CA,则很可能它还包含指向签署者证书的权威来源的URL。 ...最后
请注意,如果您使用的是自签名证书,则另一方必须将您的公钥添加到其kdb或jks中才能进行连接。目前,双方无法就协议达成一致,但一旦他们这样做,他们就会相互验证协议。证书。此时,我在上面的链接中提供的调试程序应证明非常有帮助。