gpt4 book ai didi

java - 如何将 JVM 参数 `-Dcom.ibm.mq.cfg.useIBMCipherMappings=false` 添加到 IBM MQ?

转载 作者:行者123 更新时间:2023-12-02 09:51:07 27 4
gpt4 key购买 nike

最近我已迁移到 IBM MQ v8 到 IBM MQ v9(特别是 v9.1.2.0)。我使用 SSL 与代理进行通信。因此按照 Deprecated 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 and CipherSuites in IBM MQ classes for JMS映射密码套件名称的文档。我在应用程序中使用了 IBM MQ 中已经提供的一些等效 CipherSuite (Oracle JRE) 列值。但仍然遇到问题。

我找到this answer后建议添加此 -Dcom.ibm.mq.cfg.useIBMCipherMappings=false IBM MQ 的 JRE 的参数(据我了解)。这可能允许 IBM MQ 使用 Oracle 编译的密码套件名称。我的问题是,

  1. 如何添加此 JVM 参数 -Dcom.ibm.mq.cfg.useIBMCipherMappings=false到 IBM MQ JRE?

这个Problem Connecting a Java Client (JMS) to a IBM MQ问题表明需要将相同的参数作为系统属性添加到应用程序System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false") ,但并没有什么不同。

Java connection to WMQ 8问题也提出了相同的解决方案,但没有提及如何将此 JVM 参数添加到 IBM MQ。

更新1

我做了一些关于如何向 IBM MQ 添加 JVM 参数的研究。但我只能找到Websphere应用程序服务器的解决方案。

我当前在应用程序中使用的 CipherSuite 是;

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (Oracle JRE complied)

IBM MQ 有各自的;

ECDHE_ECDSA_AES_128_CBC_SHA256 (IBM MQ complied)

更新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.

有一些解释。

最佳答案

经过一段时间的工作,我能够解决这个问题。从一开始我就在应用程序端遇到了这个证书配置问题。即使在创建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 客户端库使用 Oracle JVM 编译的密码套件名称。为此,请添加此 -Dcom.ibm.mq.cfg.useIBMCipherMappings=false作为 JVM 标志或添加此 System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false")作为系统属性。

选择适当的密码套件与 MQ 通信。这个TLS CipherSpecs and CipherSuites in IBM MQ classes for JMS文档会很有帮助,因为 IBM 有 deprecated IBMMQ 9 及以上的密码规范数量。

我建议使用ECDHE_*他们提供的密码规范 Ephemeral Keys维持Forward Secrecy

然后,使用ikeyman GUI工具,我创建了一个self-signed证书标记为 ibmwebspheremq<queue_manager_name>名称而不是提取 .arm文件中,我将证书导出为 .jks文件。两者keystore.jkstruststore.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>");

在我的例子中,这些凭据是系统凭据。

如果您只是想像这样跳过用户身份验证,可以使用 runmqsc 更新 IBMMQ 配置以跳过凭证检查。像这样的 CLI 工具(请参阅此 Turning on connection authentication on a queue manager 文档),

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 为解决此问题提供的支持。

关于java - 如何将 JVM 参数 `-Dcom.ibm.mq.cfg.useIBMCipherMappings=false` 添加到 IBM MQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56321307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com