IBMQ在SSL握手时抛出java.lang.UnsupportedOperationException

baubqpgj  于 2023-03-21  发布在  Java
关注(0)|答案(5)|浏览(153)

呼叫时:

MQQueueConnectionFactory cf ...
cf.createConnection();

com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.handshakeCompleted方法开始:

public void handshakeCompleted(HandshakeCompletedEvent event) {
 X509Certificate[] peerCertificateChain = event.getPeerCertificateChain();
 ...

javax.net.ssl.SSLSession中的getPeerCertificateChain:

default X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException {
    throw new UnsupportedOperationException("This method is deprecated and marked for removal. Use the getPeerCertificates() method instead.");
}

导致此异常:

Exception in thread "HandshakeCompletedNotify-Thread" java.lang.UnsupportedOperationException: This method is deprecated and marked for removal. Use the getPeerCertificates() method instead.
    at java.base/javax.net.ssl.SSLSession.getPeerCertificateChain(SSLSession.java:295)
    at java.base/javax.net.ssl.HandshakeCompletedEvent.getPeerCertificateChain(HandshakeCompletedEvent.java:173)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.handshakeCompleted(RemoteTCPConnection.java:2448)
    at java.base/sun.security.ssl.TransportContext$NotifyHandshake$1.run(TransportContext.java:685)
    at java.base/sun.security.ssl.TransportContext$NotifyHandshake$1.run(TransportContext.java:682)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/sun.security.ssl.TransportContext$NotifyHandshake.run(TransportContext.java:682)
    at java.base/java.lang.Thread.run(Thread.java:832)

该项目唯一的IBM MQ依赖项是:

com.ibm.mq:com.ibm.mq.allclient:9.2.0.0

为什么javax.net.ssl.getPeerCertificateChain()调用那个被弃用的方法?看起来问题出在HandshakeCompletedEvent类中,而不是MQ。
编辑:此问题始于Java 15。

flseospp

flseospp2#

在你的问题中,你提到这是Java 15的失败,你发布了一个使用Java 14或更早版本的自我回答。
根据IBM MQ 9.2 Detailed System Requirements页面的“Supported Software”选项卡,IBM仅在各种版本的Java 8和Java 11上支持MQ v9.2。
我在下面列出了今天(2020年9月25日)在该页面上显示的版本,但我建议您始终参考上面的IBM页面以获取当前结果:

  • 采用OpenJDK和OpenJ 9 JVM:11和未来的补丁包
  • Java开发工具包:V8 R 0和未来的补丁包
  • IBM Runtime Environment,Java Technology Edition:8和未来的补丁包
  • IBM Runtime Environment,Java Technology Edition:8.0.1和未来的补丁包
  • IBM Runtime Environment,Java Technology Edition:8.0.4.1和未来的修复包
  • IBM Runtime Environment,Java Technology Edition:8.0.5.0和未来的修复包
  • IBM Runtime Environment,Java Technology Edition:8.0.6.0和未来的修复包
  • Oracle Java SDK/JRE/JDK:8.0和未来的补丁包
  • Oracle Java SDK/JRE/JDK:11.0.1和未来的补丁包

使用任何未在IBM官方MQ v9.2系统要求页面上列出的Java版本将由您自己承担风险。如果您使用的是Java 14,并且有一个问题需要从IBM获得支持,他们可能会告诉您该版本不支持,并在受支持的版本中重现该问题。

7eumitmz

7eumitmz3#

我创建了一个库,如果您对MQConnectionFactory具有编程访问权限,则可以解决这个问题。legacy-compatibility-ssl-socket-factory通过委托给另一个SSLSocketFactorygetPeerCertificates(),为您提供了一个实现getPeerCertificateChain()SSLSession

mqConnectionFactory.setSSLSocketFactory(new LegacyCompatibilitySSLSocketFactory());
yyyllmsg

yyyllmsg4#

IBM MQ客户端9.2.4.0支持Java 17
https://www.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/8/899/ENUSLP21-0278/index.html

MQ 9.2.4

  • 通过更新统一群集实现智能工作负载再平衡
  • 基于MQ中现有强大安全机制的安全增强,旨在确保任务关键型业务数据得到保护
  • MQ客户端支持新的Java™ 11运行时
  • 对Java 17运行时的MQ客户端支持

https://www.ibm.com/docs/en/ibm-mq/9.2?topic=wnim9-whats-new-in-mq-924-multiplatforms-base-advanced-entitlement#mq924_new_multibaseadv__java17support

Java 17支持IBM MQ客户端

  • IBM MQ 9.2.4添加了对Java的IBM MQ类和JMS for Oracle和Oracle以及Adoptium的IBM MQ类的Java 17支持。

如果使用maven,您可以通过

<dependency>
    <groupId>com.ibm.mq</groupId>
    <artifactId>com.ibm.mq.allclient</artifactId>
    <version>9.2.4.0</version>
</dependency>
5lhxktic

5lhxktic5#

解决方案:使用Java 14或更早版本。

相关问题