从 Oracle JVM (JSSE) 使用 SSL
另请参阅“从 Oracle Java(非 IBM JRE)连接到 MQ 队列管理器时支持哪些 TLS 密码规范/密码套件? ”
在 MQ 客户端版本 8.0.0.2 中包含一个补丁以将 TLS 与 Oracle JVM 一起使用,这适用于上面的通道答案
要让它工作,您将需要包含
IV66840的最新 MQ 客户端:WMQ V7 JAVA/JMS:在非 IBM JAVA 运行时环境中运行时添加对选定 TLS 密码规范的支持
http://www-01.ibm.com/support /docview.wss?uid=swg1IV66840
(下载)
根据您所在的位置,您可能还需要安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8(下载)
要使用它,您必须使用 JVM 参数进行配置:
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
请注意,Oracle 和 IBM JVM 之间的默认安全实现行为不同:
Oracle JSSE 参考指南说:
如果 KeyManager[] 参数为 null,则将为该上下文定义一个空的 KeyManager。
IBM JSSE 参考指南说:
如果 KeyManager[] 参数为空,将在已安装的安全提供程序中搜索 KeyManagerFactory 的最高优先级实现,从中获取适当的 KeyManager。
这意味着您必须设置自己的 ssl 上下文
SSLContext sslcontext = SSLContext.getInstance("TLS");
String keyStore = System.getProperty("javax.net.ssl.keyStore");
String keyStoreType = System.getProperty("javax.net.ssl.keyStoreType", KeyStore.getDefaultType());
String keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword","");
KeyManager[] kms = null;
if (keyStore != null)
{
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(keyStoreType);
if (keyStore != null && !keyStore.equals("NONE")) {
fs = new FileInputStream(keyStore);
ks.load(fs, keyStorePassword.toCharArray());
if (fs != null)
fs.close();
char[] password = null;
if (keyStorePassword.length() > 0)
password = keyStorePassword.toCharArray();
kmf.init(ks,password);
kms = kmf.getKeyManagers();
}
sslcontext.init(kms,null,null);
然后将其提供给 MQ JMS 客户端:
JmsConnectionFactory cf = ...
MQConnectionFactory mqcf = (MQConnectionFactory) cf;
mqcf.setSSLSocketFactory(sslcontext.getSocketFactory());
如果使用应用程序服务器,这可能由您的应用程序服务器处理。