Как добавить аргумент JVM `-Dcom.ibm.mq.cfg.useIBMCipherMappings = false` в IBM MQ? - PullRequest
0 голосов
/ 27 мая 2019

Недавно я был перенесен в IBM MQ v8 в IBM MQ v9 (в частности, в v9.1.2.0).Я использовал SSL для связи с брокером.Так, в соответствии с документом Устаревшие CipherSpecs , IBM устарела для ряда комплектов шифров, которые пришли с MQ 8, и кажется, что все комплекты шифров, которые я использовал, устарели с версии v9 и выше.Поэтому я реализовал новые комплекты шифров TLS для работы с моим приложением, которое работает на Oracle JVM (версия 1.8.0_211).С тех пор, как я получаю следующее исключение в приложении:

com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2400'.
    at com.ibm.mq.MQManagedConnectionJ11.constructMQCD(MQManagedConnectionJ11.java:1437)
    at com.ibm.mq.MQManagedConnectionJ11.constructCNO(MQManagedConnectionJ11.java:1537)
    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:221)
    ... (Omitted the rest)

Когда я копаю причину, обнаружил, что это проблема с наборами шифров IBM MQ и несоответствием имен наборов шифров Oracle JRE.Но я ссылался TLS CipherSpecs и CipherSuites в классах IBM MQ для документа JMS , чтобы отобразить имена наборов шифров.Я использовал в своем приложении некоторые из значений Эквивалентный CipherSuite (Oracle JRE) , которые уже доступны в IBM MQ.Но проблема все еще возникает.

После того, как я нашел этот ответ , который советует добавить этот аргумент -Dcom.ibm.mq.cfg.useIBMCipherMappings=false в JRE IBM MQ (насколько я понимаю).Это может позволить IBM MQ использовать совместимые с Oracle имена комплектов шифров.У меня вопрос:

  1. Как добавить этот аргумент JVM -Dcom.ibm.mq.cfg.useIBMCipherMappings=false в IBM MQ JRE?

Эта Проблема с подключением клиента Java (JMS) кВопрос IBM MQ предполагает, что в приложение необходимо было добавить тот же параметр, что и системное свойство System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false"), но это не изменило его.

Java-соединение с вопросом WMQ 8 также описывает то же решение, но не упоминает, как добавить этот аргумент JVM в IBM MQ.

Обновление 1

Я провел некоторое исследование о том, как добавить аргумент JVM в IBM MQ.Но мне удалось найти только решения для сервера приложений Websphere.

CipherSuite, который я сейчас использую в приложении, это;

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (Oracle JRE соответствует)

IBM MQ имеет соответственно;

ECDHE_ES5A6_6255* (IBM MQ соответствует)

Обновление 2

После создания файла key.kdb с помощью инструмента ikeyman с помощью диспетчера очереди параметров stash можноуспешно прочитал сертификаты в нем.Также я включил самозаверяющий сертификат, помеченный ibmwebspheremq<lowercase_queue_manage_name>.Но теперь я получаю другое исключение на стороне клиента:

Exception in thread "main" com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2059'.
    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:255)
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:450)
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:487)
    at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:97)

и в журнале MQ я могу найти эту запись;

AMQ9637E: Channel is lacking a certificate.

с некоторыми пояснениями.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Поработав некоторое время, я смог решить эту проблему.С самого начала у меня была эта проблема конфигурации сертификата на стороне приложения.Даже после создания self-signed сертификата, помеченного после ibmwebspheremq<queue_manager_name> и совместного использования извлеченных сертификатов с клиентским приложением с помощью инструмента ikeyman, произошло AMQ9637E: Channel is lacking a certificate..

В двух словах, чтобы полностью решить эту проблему, я сделалследующее:

Обновите зависимость MQ клиента до com.ibm.mq.allclient:v9.1.2.0.Если вы используете maven, используйте следующую зависимость ( MQC91: IBM MQ Clients ).

<dependency>
    <groupId>com.ibm.mq</groupId>
    <artifactId>com.ibm.mq.allclient</artifactId>
    <version>9.1.2.0</version>
</dependency>

Теперь, если приложение работает на Oracle JVM, мы должны убедить MQ-клиентlib для использования имен комплектов шифров Oracle JVM.Для этого либо добавьте -Dcom.ibm.mq.cfg.useIBMCipherMappings=false в качестве флага JVM, либо добавьте System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false") в качестве системного свойства.

Выберите подходящий набор шифров для связи с MQ.Этот документ TLS CipherSpecs и CipherSuites в классах IBM MQ для JMS будет полезен, поскольку IBM имеет устаревшее число слабых спецификаций шифров IBMMQ 9 и более поздних версий.

Я бы предложил использовать ECDHE_* спецификации шифров, поскольку они предоставляют Эфемерные ключи для поддержания Прямой секретности .

Затем, используя инструмент ikeyman GUI, я создал сертификат self-signed, помеченный именем ibmwebspheremq<queue_manager_name>, и вместо извлечения файла .arm я экспортирую сертификат как файлы .jks.Файлы keystore.jks и truststore.jks экспортированы из одного сертификата.После этого подключите их к приложению с помощью системных свойств;

System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "<password>");
System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "<password>");

В этой конфигурации проблема рукопожатия SSL исчезла, но IBM MQ все еще запрашивал аутентификацию пользователя с использованием имени пользователя и пароля.Чтобы предоставить их, следует добавить эти свойства в MQEnvironment,

MQEnvironment.properties.put(com.ibm.mq.constants.CMQC.USER_ID_PROPERTY, "<user_name>");
MQEnvironment.properties.put(com.ibm.mq.constants.CMQC.PASSWORD_PROPERTY, "<password>");

. В моем случае эти учетные данные были системными учетными данными.

Если вы просто хотите пропустить проверку подлинности пользователя следующим образом,вы можете обновить конфигурацию IBMMQ, чтобы пропустить проверку учетных данных, используя runmqsc CLI-инструмент, подобный этому (см. Включение аутентификации соединения в администраторе очередей документ),

ALTER QMGR CONNAUTH(USE.PW)
DEFINE AUTHINFO(USE.PW) +
AUTHTYPE(IDPWOS) +
FAILDLAY(10) +
CHCKLOCL(OPTIONAL) +
CHCKCLNT(OPTIONAL)
REFRESH SECURITY TYPE(CONNAUTH)

Обратите внимание, что CHCKCLNT значение необходимо установить как OPTIONAL, чтобы игнорировать проверку учетных данных пользователя клиента.IBM MQ должен начать работать с клиентским приложением, когда SSL включен после этих конфигураций.

Спасибо @JoshMc за поддержку в решении этой проблемы.

0 голосов
/ 30 мая 2019

Примечание. Добавление ответа для сбора информации, предоставленной ОП в комментариях, которые были удалены.


На следующей странице центра знаний IBM MQ приведена таблица, показывающая совместимость типов сертификатов с MQ v9.1:

IBM MQ 9.1.x / IBM MQ / Защита / Конфиденциальность сообщений / Включение CipherSpecs

Шифрам с ECDHE_ECDSA требуется сертификат b для администратора очередей. Если для вашего приложения используется сертификат клиента, он также должен быть комплектом b.

Обратите внимание, что вы можете использовать ECDHE_RSA шифры с неподключенными b-сертификатами.


Файл хранилища (key.sth for example) используется администратором очередей для доступа к файлу kdb. Эквивалент java на стороне клиента - это вы указываете пароль jks.

...