使用Oracle JVM(JSSE)的SSL
另请参见“从Oracle Java(非IBM JRE)连接到MQ队列管理器时支持哪些TLS密码规范/密码套件?”
在MQ客户端版本8.0.0.2中,已包含一个补丁以使用TLS与Oracle JVM,这适用于上面lanes的答案
为了使此功能正常工作,您需要包含最新的MQ Client,其中包含
IV66840:WMQ V7 JAVA/JMS:在非IBM Java运行时环境中运行时添加对选定TLS密码规范的支持
http://www-01.ibm.com/support/docview.wss?uid=swg1IV66840
(
下载)
根据您所在的位置,您可能还需要安装Java Cryptography Extension(JCE)无限制权限策略文件8(
下载)
要使用此功能,您必须使用JVM参数进行配置。
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
请注意,Oracle和IBM JVM之间的默认安全实现行为
不同:
Oracle JSSE参考指南表示:
如果KeyManager[]参数为null,则将为此上下文定义一个空的KeyManager。
IBM JSSE参考指南表示:
如果KeyManager[]参数为null,则将搜索已安装的安全提供程序以获取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())
如果使用应用服务器,这可能由您的应用服务器处理。