如何使用SSL_RSA_WITH_AES_128_CBC_SHA(在队列连接工厂中)使用TLS_RSA_WITH_AES_128_CBC_SHA连接到服务器来获取JMS客户端
代码:
// Instantiate the initial context
String contextFactory = "com.sun.jndi.fscontext.RefFSContextFactory";
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
environment.put(Context.PROVIDER_URL, initialContextUrl);
Context context = new InitialDirContext(environment);
System.out.println("Initial context found!");
String keystoreName = System.getProperty("javax.net.ssl.keyStore");
System.out.println("keystoreName " + keystoreName + " canRead " + new File(keystoreName).canRead());
String truststoreName = System.getProperty("javax.net.ssl.trustStore");
System.out.println("truststoreName " + keystoreName + " canRead " + new File(truststoreName).canRead());
// Lookup the connection factory
JmsConnectionFactory cf = (JmsConnectionFactory) context.lookup(connectionFactoryFromJndi);
System.out.println("CF = " + cf.getClass().getName());
MQConnectionFactory mqcf = (MQConnectionFactory) cf;
System.out.println("getSSLCipherSuite:" + mqcf.getSSLCipherSuite());
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
// Lookup the destination
destination = (JmsDestination) context.lookup(destinationFromJndi);
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
// Create JMS objects
connection = cf.createConnection();
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
consumer = session.createConsumer(destination);
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
// Start the connection
connection.start();
System.out.println("getSSLSocketFactory:" + mqcf.getSSLSocketFactory());
给我:
Initial context found!
keystoreName C:/Users/...key.jks canRead true
truststoreName C:/Users/.../key.jks canRead true
CF = com.ibm.mq.jms.MQConnectionFactory
getSSLCipherSuite:SSL_RSA_WITH_AES_128_CBC_SHA
getSSLSocketFactory:null
getSSLSocketFactory:null
keyStore is : C:/Users/.../key.jks
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
***
found key for : ibmwebspheremquserid
.....
Valid from Mon May 14 23:59:46 CEST 2012 until Thu May 14 23:59:46 CEST 2015
trigger seeding of SecureRandom
done seeding SecureRandom
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: Failed to connect to queue manager 'qm' with connection mode 'Client' and host name 'host(1414)'.
Check the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information.
Inner exception(s):
com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2393' ('MQRC_SSL_INITIALIZATION_ERROR').
com.ibm.mq.jmqi.JmqiException: CC=2;RC=2393;AMQ9204: Connection to host 'host(1414)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2393;AMQ9771: SSL handshake failed. [1=java.lang.IllegalArgumentException[Unsupported ciphersuite SSL_RSA_WITH_AES_128_CBC_SHA],3=host/host:1414 (10.20.28.12),4=SSLSocket.createSocket,5=default]],3=host(1414),5=RemoteTCPConnection.makeSocketSecure]
com.ibm.mq.jmqi.JmqiException: CC=2;RC=2393;AMQ9771: SSL handshake failed. [1=java.lang.IllegalArgumentException[Unsupported ciphersuite SSL_RSA_WITH_AES_128_CBC_SHA],3=host/host:1414 (10.20.28.12),4=SSLSocket.createSocket,5=default]
java.lang.IllegalArgumentException: Unsupported ciphersuite SSL_RSA_WITH_AES_128_CBC_SHA
FAILURE
答案 0 :(得分:1)
切换到IBM JRE / JDK,它将起作用。
答案 1 :(得分:1)
使用Oracle JVM(JSSE)中的SSL
另见" What TLS cipherspecs/ciphersuites are supported when connecting from Oracle Java (non-IBM JRE) to MQ queue manager?"
在MQ Client V8.0.0.2中,包含了一个补丁,用于将TLS与Oracle JVM一起使用,这适用于上面的lanes回答
要使其工作,您将需要包含的最新MQ客户端
IV66840:WMQ V7 JAVA / JMS:为选定的TLS CIPHERSPECS添加支持
在非IBM JAVA RUNTIME环境中运行
http://www-01.ibm.com/support/docview.wss?uid=swg1IV66840
(download)
根据您所在的位置,您可能还需要安装 Java密码术扩展(JCE)无限强度管辖权政策文件8(download)
要使用此功能,必须使用JVM参数进行配置:
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
请注意Oracle和IBM JVM之间的默认安全实现行为differs:
如果KeyManager []参数为null,则空KeyManager将为 为此背景定义。
如果KeyManager []参数为null,则表示已安装的安全性 将搜索提供程序以获得最高优先级的实现 KeyManagerFactory,适当的KeyManager将从中 获得。
这意味着您必须设置your own ssl context
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());
如果使用应用程序服务器,则可能由应用程序服务器处理。