如何为Websphere MQ客户端启用带有客户端证书的SSL



我们是使用Websphere MQ 8.x的大型环境中的一个应用程序,也是某些数据接口的客户端。我们的应用程序是运行在WildFly 9上的Java EE应用程序,该应用程序使用资源适配器(wmq.jmsra.rar),该适配器与EAR文件一起部署在同一AS中。我们在两个方向上与MQ Server交互。因此,一方面,我们有一些MDB(由于历史来源仍然是EJB 2.x格式,没有注释)列出了一些队列,并且由ejb-jar.xml部署描述符配置,其中包含激活配置属性destinationType, channel, queueManager, hostName, username, password。另一方面,我们有一个发送器,它通过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>

此外,由于我使用的是非IBM虚拟机,因此需要设置以下参数:

-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

然后,有必要在standalone-full.xml中的RAR配置上设置密码套件属性,以及我的WildFly安装的其他连接参数:

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

最后,队列上列出的MDB也必须配置为使用密码套件,所以在我的情况下,我必须通过为每个MDB添加来将其添加到ejb-jar.xml中

<activation-config-property>
<activation-config-property-name>sslCipherSuite</activation-config-property-name>
<activation-config-property-value>xxx</activation-config-property-value>
<activation-config-property>

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

  • APAR IV66840:TLS密码规范在非IBM JRE中直到8.0.0.2才得到支持。

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


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

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

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

RFC 5246相关章节的引文位于本文底部。


@a_cornish_pasty回答您的问题";使用JMS的特定密钥库";也是一种替代方案,因为它允许您指定一个与Wildfly其他部分使用的密钥存储区不同的密钥存储,该密钥存储区可能只有MQ证书,因此不可能导致现有密钥存储区和证书出现问题。


RFC 5246第7.4.4节规定如下:

7.4.4.证书申请

何时发送此消息:

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

然后进入状态:

certificate_authorities

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

RFC 5246第7.4.6节规定如下:

7.4.6.客户端证书

何时发送此消息:

这是客户端在收到ServerHelloDone消息只有当服务器请求证书如果没有合适的证书,客户端必须发送不包含的证书消息证书也就是说,certificate_list结构具有长度为零。如果客户端未发送任何证书,则服务器可以自行决定是否继续握手客户端身份验证,或以致命握手失败进行响应警觉的此外,如果证书链的某些方面不可接受(例如,它不是由已知的、可信的CA签署的)服务器可以自行决定是否继续握手(考虑到客户端未经身份验证)或发送致命警报。

然后进入状态:

  • 如果证书请求中的certificate_authorities列表消息非空,证书中的一个证书链应由列出的CA之一发布

最新更新