如何使用Websphere MQ客户端的客户端证书启用SSL?

时间:2017-10-25 12:16:19

标签: java ssl java-ee ibm-mq client-certificates

使用Websphere MQ 8.x,我们是更大环境中的一个应用程序和某些数据接口的客户端。我们的应用程序是在WildFly 9上运行的Java EE应用程序,它使用资源适配器(wmq.jmsra.rar),该资源适配器与同一AS中的EAR文件一起部署。我们在两个方向上与MQ Server进行交互。因此,我们一方面有一些MDB(由于历史起源仍然是EJB 2.x格式,没有注释)列入一些队列,并由ejb-jar.xml部署描述符配置,包含激活配置属性{ {1}}。另一方面,我们有一个发送器,它通过JNDI查找队列连接工厂和队列,并创建一个连接。

现在我们要求新建立的MQ服务器通过SSL和客户端证书进行通信。我们从服务器人那里得到了这样的机器证书。所以我的问题是:

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

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

必须设置以下参数:

destinationType, channel, queueManager, hostName, username, password

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

-Djavax.net.ssl.trustStore=<location of trustStore>
-Djavax.net.ssl.keyStore=<location of keyStore>
-Djavax.net.ssl.keyStorePassword=<password>

然后,有必要在-Dcom.ibm.mq.cfg.useIBMCipherMappings=false 中的RAR配置上设置密码套件属性以及我的WildFly安装的其他连接参数:

standalone-full.xml

最后,队列中的MDB列表也必须配置为使用密码套件,因此在我的情况下,我必须通过为每个MDB添加来在ejb-jar.xml中添加:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

@a_cornish_pasty回答您的问题“Use specific keystore for JMS”也是一种替代方案,因为它允许您指定一个与Wildfly其余部分使用的单独的密钥库,这个密钥库只能拥有MQ证书,所以没有可能导致现有密钥库和证书出现问题。

RFC 5246 Section 7.4.4声明如下:

  

7.4.4。证书申请

     

发送此消息时:

     

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

然后继续陈述:

  

certificate_authorities

     

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

RFC 5246 Section 7.4.6声明如下:

  

7.4.6。客户证书

     

发送此消息时:

     

这是客户端收到邮件后可以发送的第一条消息      ServerHelloDone消息。 仅在服务器上发送此消息      申请证书。 如果没有合适的证书,      客户端必须发送包含否的证书消息      证书。 也就是说,certificate_list结构有一个      零长度。如果客户端没有发送任何证书,那么      服务器可以自行决定是否继续握手      客户端身份验证,或使用致命的handshake_failure进行响应      警报。此外,如果证书链的某些方面是      不可接受的(例如,它没有由已知的,可信的CA签名),      服务器可以自行决定是否继续握手      (考虑到客户未经认证)或发送致命警报。

然后继续陈述:

  
      
  • 如果证书请求中有certificate_authorities列表     消息非空,证书中的一个证书     链应该由其中一个列出的CA颁发。
  •