使用JMS通过SSL连接到WebSphere MQ 7.0

时间:2012-02-19 17:46:01

标签: java ssl jms ibm-mq

我正准备通过SSL连接到Websphere MQ 7.0的测试环境,所以我必须在开始configuring the SSL connection from JMS side之前在Websphere MQ上自己配置SSL。

所以,我正在尝试按照these步骤为Websphere MQ创建SSL证书。但是当我尝试使用命令gsk7cmd.exe -cert -receive -db key.kdb -pw pass -file QMANAGER_signed.arm将签名证书添加到存储库时,我收到错误:

An attempt to receive the certificate has failed.
All the signer certificates must exist in the key database.

我甚至尝试了C命令gsk7capicmd,但它也失败了,错误:

Error: 146

Error id: GSKKM_ERR_INVALID_CERT_CHAIN
Details: QMANAGER_signed.arm

更新1:

我使用WMQ SSL向导来创建正确的配置。配置进行顺利,但是当我运行SSL向导附带的JMS示例时,我收到错误:MQJE001: Completion Code '2', Reason '2397' SSL日志(使用选项-Djavax.net.debug=all)显示以下错误:

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;AMQ9771: SSL handshake failed. [1=javax.net.ssl.SSLHandshakeExcep
tion[Remote host closed connection during handshake],3=localhost/127.0.0.1:1414 (localhost),4=SSLSocket.startHandshake,5
=default]
        at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:995)
        at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.connect(RemoteConnection.java:989)
        at com.ibm.mq.jmqi.remote.internal.system.RemoteConnectionPool.getConnection(RemoteConnectionPool.java:293)
        at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1371)
        at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:331)
        ... 7 more
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
        at com.ibm.jsse2.jc.a(jc.java:380)
        at com.ibm.jsse2.jc.g(jc.java:115)
        at com.ibm.jsse2.jc.a(jc.java:240)
        at com.ibm.jsse2.jc.startHandshake(jc.java:54)
        at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:989)
        ... 11 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
        at com.ibm.jsse2.a.a(a.java:7)
        at com.ibm.jsse2.jc.a(jc.java:493)
        ... 15 more

更新2:

使用T.Rob在他的回答中提到的诊断技术,我仍然停留在第3点,与之前的错误相同。

1 个答案:

答案 0 :(得分:4)

您看到的错误是因为您的密钥库没有签名CA的根和/或中间签名者证书。从证书颁发机构获得签名证书后,必须先将其验证,然后再将其添加到密钥库。几乎任何人都可以拦截您的签名请求并签署证书。收到时验证它的步骤确保它是由您实际信任的CA签署的,而不是一些匿名的中间人。

验证证书的方式是通过根据KDB中CA的公钥检查CA签名。为此,当您尝试接收已签名的证书时,CA证书必须已在KDB中。如果CA使用中间签署者证书(并且由于各种原因,任何商业CA 使用中间证书),那么您还必须导入中间证书根证书。这形成了从CA的根证书到签名证书的任何中间证书的证书链或证书路径。链中的每个东西都由它上面的东西验证,直到你到达根。您的KDB 必须拥有整个链,并且因为每个证书都由其上面的证书进行验证,您必须从根目录开始导入这些证书并逐步完成。

通常,您的CA会在其网站上发布其签名者证书,您可以使用SSL检索这些证书。获取并导入它们,您将能够收到您签名的证书。

实际上,The Sphere Online Journal刚刚发布了一篇文章,以Verisign为例介绍了这个过程,以及导入根和中间签名者证书的屏幕截图。本文是关于 Renewing WebSphere MQ Certificates 的,但本文的第一部分创建了一个kdb文件和一个签名请求,然后导入了CA证书和签名证书。

让我们带您到正确的信息中心。请查看 Using CA Signed Certificates 上的WMQ v7.0信息中心部分。您正在查看的是Message Broker,坦率地说,您链接的文章有点混乱。我会看到修复它。对于初学者来说,关于在一个kdb中创建证书,对其进行签名,然后将其导出,删除并将其导入QMgr的KDB这一点都是纯粹的垃圾。只需在QMgr自己的KDB文件中生成CSR,并直接接收签名证书。这更容易,并且是上述文章中说明的过程。

最后,如果你去t-rob.net并从IMPACT 2011下载WMQ安全实验室,你会发现有实验室指南和一些脚本。它们使用自签名证书,但脚本可以轻松转换为使用CA签名证书,然后定制,以便在WMQ网络中使用。

<强>更新
在评论中回答他的其他问题:

我实际上打算使用自签名证书,所以我想我只需要提取它并将其添加到客户的信任存储中?

是的,这是正确的。但是,WMB信息中心页面中的一个问题最初是链接的,因为它要求您创建一个标签为qmgrname而不是ibmwebspheremqqmgrname的证书。 QMgr根据标签查找其证书,因此必须匹配指定的格式。因此,当您创建自签名证书时,请确保标签是文字ibmwebspheremq,其中QMgr名称折叠为附加小写。如果您使用错误的标签制作了证书,则可以始终将其导出到P12文件,然后将其导入到具有正确标签的新KDB。

我使用了WMQ安全实验室中提到的WMQ SSL向导来创建正确的配置。配置进行顺利,但是当我运行SSL向导附带的JMS示例时,我收到错误MQJE001: Completion Code '2', Reason '2397',SSL日志显示以下错误main, received EOFException: error main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake main, SEND TLSv1 ALERT: fatal, description = handshake_failure

可能会出现这种情况的原因有几个。我会建议一些诊断技术,而不是通过所有这些。当我设置SSL通道时,我总是使用以下过程:

  1. 在没有SSL的情况下运行频道。这证明基本通信路径正常工作(侦听器运行,端口匹配,通道对象定义匹配等)。
  2. 如果这是QMgr第一次使用SSL,或者kdb已更改,请务必发出REFRESH SECURITY TYPE(SSL)命令。
  3. 通过在QMgr和客户端指定相同的密码套件来启用SSL,但请确保QMgr的SVRCONN通道设置为SSLCAUTH(OPTINAL) SSLPEER()。这将验证客户端是否接受 QMgr的证书。只有在这样做时,请转到下一步。
  4. 现在将QMgr的SVRCONN更改为SSLCAUTH(REQUIRED) SSLPEER()。这会导致QMgr请求客户端的证书。
  5. 如果使用SSLPEER将其设置为所需的值。
  6. 此过程隔离了可能出现的问题,以便您随时知道要查找的位置。如果该过程在步骤#3中失败,那么应用程序的SSL配置存在问题,或者它无法验证QMgr的证书。如果该过程在步骤#4中失败,那么我们知道应用程序的SSL配置是合理的,并且它喜欢QMgr的证书,而QMgr并不喜欢应用程序证书。如果我们进入第5步,那么只需要使SSLPEER值正确。

    因为你的握手失败似乎是由于QMgr关闭了TCP连接,我假设你有SSLCAUTH(REQUIRED)(这是默认的,顺便说一句),而且QMgr没有&# 39;没有应用程序的证书,或者您尝试使用匿名连接,而客户端不需要个人证书。如果是这种情况,设置SSLCAUTH(OPTIONAL)将使您超越失败点 - 尽管可能是一个全新的失败点。