Проблема, с которой вы столкнулись, заключается в том, что классы IBM MQ для JMS (com.ibm.mq.allclient.jar
) могут работать как с Java JSSE IBM, так и не IBM (например, Oracle). Имена Ciphersuite отличаются между двумя реализациями Java JSSE. По большей части, когда Oracle следует стандартам именования IETF, а префикс набора шифров - TLS_
, IBM заменяет его на SSL_
.
Таблица, документирующая, как канал IBM MQ SVRCONN
CIPHERSPEC
сопоставление имен с именем шифровального набора IBM и Oracle Java JSSE можно найти в центре знаний IBM: IBM MQ> Разработка приложений> Разработка приложений JMS и Java> Использование классов IBM MQ для JMS> Написание классов IBM MQ для JMSприложения> Доступ к функциям IBM MQ из классов IBM MQ для приложения JMS> Использование TLS с классами IBM MQ для JMS> TLS CipherSpecs и CipherSuites в классах IBM MQ для JMS
Например, CIPHERSPEC
выпри условии, что TLS_RSA_WITH_AES_256_CBC_SHA256
содержит эту запись в таблице.
CipherSpec |Equivalent CipherSuite (IBM JRE) |Equivalent CipherSuite (Oracle JRE) |Protocol |FIPS 140-2 compatible |
--------------------------------+---------------------------------+------------------------------------+---------+----------------------|
TLS_RSA_WITH_AES_256_CBC_SHA256 |SSL_RSA_WITH_AES_256_CBC_SHA256 |TLS_RSA_WITH_AES_256_CBC_SHA256 |TLS v1.2 |yes |
Вы столкнулись с двумя проблемами:
Во-первых, чтобы сообщить классам IBM MQ для JMS, что вы хотите, чтобы он использовал отображение шифра Oracle, вам нужно установить системное свойство Java com.ibm.mq.cfg.useIBMCipherMappings
до значения false
(обратите внимание, по умолчанию это true
).
Это можно сделать в вашем коде:
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
или в командной строке:
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
Во-вторых, когда вы используете JMSAdmin для создания файла привязки, он по умолчанию примет указанное вами имя набора шифров и "преобразует" его в имя набора шифров IBM. Поэтому, когда вы указали TLS_RSA_WITH_AES_256_CBC_SHA256
, он преобразовал его в SSL_RSA_WITH_AES_256_CBC_SHA256
в полученном файле привязки.
Чтобы исправить это, вам нужно отредактировать JMSAdmin
и найти строку, подобную этой:
$AMQJAVA -Dcom.ibm.msg.client.commonservices.log.outputName=$MQ_JAVA_DATA_PATH/log -Dcom.ibm.msg.client.commonservices.trace.outputName=$MQ_JAVA_DATA_PATH/trace -DMQ_JAVA_INSTALL_PATH=$MQ_JAVA_INSTALL_PATH com.ibm.mq.jms.admin.JMSAdmin $*
Вам нужно будет добавить -Dcom.ibm.mq.cfg.useIBMCipherMappings=false
к строке, например:
$AMQJAVA -Dcom.ibm.mq.cfg.useIBMCipherMappings=false -Dcom.ibm.msg.client.commonservices.log.outputName=$MQ_JAVA_DATA_PATH/log -Dcom.ibm.msg.client.commonservices.trace.outputName=$MQ_JAVA_DATA_PATH/trace -DMQ_JAVA_INSTALL_PATH=$MQ_JAVA_INSTALL_PATH com.ibm.mq.jms.admin.JMSAdmin $*
Исправление первой проблемы позволит IBM MQ Classes for JMS использовать сопоставления шифровальных пакетов Oracle.
Исправление второй проблемы позволит создать файл привязки, содержащийправильное имя шифра Oracle.
В настоящее время возвращается ошибка RC=2393
, что означает MQRC_SSL_INITIALIZATION_ERROR
, это связано с тем, что классы IBM MQ для Java считают, что должны использовать сопоставления шифра IBM, и отправляют шифровальный набор SSL_RSA_WITH_AES_256_CBC_SHA256
имя Oracle Java, которое затем возвращает ошибку, которую вы получаете, Unsupported ciphersuite SSL_RSA_WITH_AES_256_CBC_SHA256
, потому что Oracle Java не знает о шифрованном наборе с таким именем.
Обратите внимание, что если вы хотите исправить только одну из двух проблем,затем классы IBM MQ для JMS вернут RC=2400
, что означает MQRC_UNSUPPORTED_CIPHER_SUITE
, прежде чем даже вызвать Java JSSE.