Java 如何为Websphere MQ客户端启用具有客户端证书的SSL?

Java 如何为Websphere MQ客户端启用具有客户端证书的SSL?,java,ssl,jakarta-ee,ibm-mq,client-certificates,Java,Ssl,Jakarta Ee,Ibm Mq,Client Certificates,我们是更大环境中的一个应用程序,是一些数据接口的客户机,使用WebSphereMQ8.x。我们的应用程序是一个运行在WildFly 9上的JavaEE应用程序,它使用一个资源适配器(wmq.jmsra.rar),该适配器与EAR文件一起部署在同一个目录中。我们在两个方向上与MQ服务器交互。因此,一方面,我们有一些MDB(由于历史渊源仍然是EJB2.x格式,没有注释)列出到一些队列,它们由EJB jar.xml部署描述符配置,包含激活配置属性destinationType、通道、队列管理器、主机名

我们是更大环境中的一个应用程序,是一些数据接口的客户机,使用WebSphereMQ8.x。我们的应用程序是一个运行在WildFly 9上的JavaEE应用程序,它使用一个资源适配器(
wmq.jmsra.rar
),该适配器与EAR文件一起部署在同一个目录中。我们在两个方向上与MQ服务器交互。因此,一方面,我们有一些MDB(由于历史渊源仍然是EJB2.x格式,没有注释)列出到一些队列,它们由
EJB jar.xml
部署描述符配置,包含激活配置属性
destinationType、通道、队列管理器、主机名、用户名、,密码
。另一方面,我们有一个发送方,它通过JNDI查找队列连接工厂和队列并创建连接

现在,我们需要一个新建立的MQ服务器通过SSL和客户端证书进行通信。我们从服务器人员那里为我们的机器获得了这样的证书。因此,我的问题是:

  • 必须做些什么才能使其与上述设置一起工作
  • 这是否完全可以通过配置实现,因此对应用程序是透明的,或者应用程序专门使用SSL、提供证书或类似的东西
  • 这是否与应用程序的其他部分已经使用的任何其他密钥库冲突
  • 是否需要一些额外的IBM MQ软件才能使其正常工作?(我们的客户机只是RAR,没有安装软件,我们这边也不应该建立MQ服务器。)

更新:我开始为VM设置全局JSSE属性,因为它解决了我的问题

有必要设置以下参数:

-Djavax.net.ssl.trustStore=<location of trustStore>
-Djavax.net.ssl.keyStore=<location of keyStore>
-Djavax.net.ssl.keyStorePassword=<password>
然后,有必要在
standalone full.xml
中的RAR配置上设置cipher suite属性以及我的WildFly安装的其他连接参数:

<resource-adapter id="wmq.jms.rar">
...
  <connection-definitions>
    <connection definition ...>
      <config-property name="sslCipherSuite">xxx</config-property>
...
</resource-adapter">

...
xxx
...

OP在评论中表示,他们使用OpenJDK 8,并且正在使用IBM MQ v9.0.0.1资源适配器,以下两个已知问题在该版本中都已修复,但将此信息放在此处是为了其他可能尚未处于修复版本的用户的利益:

  • APAR:8.0.0.2之前不支持非IBM JRE中的TLS密码规范

  • APAR:WildFly 9可能会遇到另一个问题,如果在查找包含客户端证书的密钥库时使用非IBM JRE,这在8.0.0.5中已修复


资源适配器包括支持TLS的MQ功能,但使用底层JSSE进行实际加密

根据RFC 5246,它建议TLS客户端只返回一个基于服务器发送“以DER编码格式表示的可接受证书颁发机构的可分辨名称[X501]列表”的合适证书。这意味着如果密钥库中的证书用于不同用途(例如:现有非MQ证书和MQ证书)不是由同一CA链签名的,并且您连接到的各种TLS服务器不接受来自密钥存储中其他证书的CA的证书(例如:现有非MQ证书和MQ证书),然后JSSE将向每个证书返回相应的证书

例如,如果现有的非MQ证书由内部CA签署,而MQ证书由另一家公司的CA签署,则MQ公司不太可能信任您的内部CA证书,相反,您连接到的其他非MQ TLS服务器不太可能信任另一家公司的CA。因为JSSE只返回一个被远程服务器信任。它们不应相互影响。您只需将MQ证书添加到现有密钥存储

RFC5246相关章节的引文在本文底部


@对您的问题“”的简单回答也是一种选择,因为它允许您指定一个独立于Wildfly其余部分使用的密钥存储,此密钥存储只能有MQ证书,因此现有密钥存储和证书不可能出现问题


声明如下:

7.4.4.证书申请

将发送此消息的时间:

非匿名服务器可以选择从 客户端,如果适用于所选密码套件。此 消息如果发送,将立即跟随ServerKeyExchange 消息(如果已发送;否则,此消息遵循 服务器的证书消息)

然后它接着说:

认证机构

可接受的可分辨名称列表[X501] 证书机构,以DER编码格式表示。这些 可分辨名称可以指定所需的可分辨名称 根CA或从属CA;因此,此消息可用于 描述已知根以及所需的授权空间。 证书颁发机构列表为空,则客户端可以 发送相应ClientCertificateType的任何证书, 除非有相反的外部安排

声明如下:

7.4.6.客户证书

将发送此消息的时间:

这是客户端在收到消息后可以发送的第一条消息 ServerHelloDone消息。仅当服务器 请求证书。如果没有合适的证书, 客户端必须发送一个证书消息,其中不包含 证书。也就是说,证书列表结构具有 长度为零。如果客户端不发送任何证书,则 服务器可以自行决定是否继续握手,而不必 客户端身份验证或响应
<resource-adapter id="wmq.jms.rar">
...
  <connection-definitions>
    <connection definition ...>
      <config-property name="sslCipherSuite">xxx</config-property>
...
</resource-adapter">
<activation-config-property>
  <activation-config-property-name>sslCipherSuite</activation-config-property-name>
  <activation-config-property-value>xxx</activation-config-property-value>
<activation-config-property>