使用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和客户端证书进行通信。我们从服务器人那里得到了这样的机器证书。所以我的问题是:
更新:我去为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">
答案 0 :(得分:2)
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证书,所以没有可能导致现有密钥库和证书出现问题。
7.4.4。证书申请
发送此消息时:
非匿名服务器可以选择从中请求证书 客户端,如果适用于选定的密码套件。这个 消息,如果发送,将立即跟随ServerKeyExchange 消息(如果已发送;否则,此消息跟随 服务器的证书消息)。
然后继续陈述:
certificate_authorities
可接受的专有名称[X501]的列表 certificate_authorities ,以DER编码格式表示。的这些 专有名称可以为a指定所需的专有名称 根CA或从属CA;因此,此消息可用于 描述已知的根以及所需的授权空间。如果 certificate_authorities列表为空,然后客户端为MAY 发送相应ClientCertificateType的任何证书, 除非有相反的外部安排。
7.4.6。客户证书
发送此消息时:
这是客户端收到邮件后可以发送的第一条消息 ServerHelloDone消息。 仅在服务器上发送此消息 申请证书。 如果没有合适的证书, 客户端必须发送包含否的证书消息 证书。 也就是说,certificate_list结构有一个 零长度。如果客户端没有发送任何证书,那么 服务器可以自行决定是否继续握手 客户端身份验证,或使用致命的handshake_failure进行响应 警报。此外,如果证书链的某些方面是 不可接受的(例如,它没有由已知的,可信的CA签名), 服务器可以自行决定是否继续握手 (考虑到客户未经认证)或发送致命警报。
然后继续陈述:
- 如果证书请求中有certificate_authorities列表 消息非空,证书中的一个证书 链应该由其中一个列出的CA颁发。