内容


IBM WebSphere 开发者技术期刊

保证 WebSphere Application Server 和 WebSphere MQ 之间连接的安全——第 1 部分

使用 WebSphere MQ JMS 提供程序

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: IBM WebSphere 开发者技术期刊

敬请期待该系列的后续内容。

此内容是该系列的一部分:IBM WebSphere 开发者技术期刊

敬请期待该系列的后续内容。

摘自 IBM WebSphere 开发者技术期刊

引言

在配置安全环境时,您必须确保所有组件都能为网络通信提供相应的身份验证、授权和加密。当我们将应用程序部署到使用 IBM WebSphere MQ 作为 JMS 提供程序的 IBM WebSphere Application Server 时,必须考虑如何正确地保证这一重要通信路径的安全。

在本文中,我们将介绍如何配置 WebSphere MQ 和 WebSphere Application Server,以对两种环境之间的通信路径进行正确的身份验证、授权和加密。这里介绍的过程可用于保护 WebSphere Application Server 环境的安全,并在 WebSphere Application Server 和本地或远程 WebSphere MQ 队列管理器之间采用 MQ SSL 服务器和客户端身份验证。缺省情况下,当使用客户端模式时,WebSphere MQ 并不提供安全访问,而是通过 TCP/IP 进行通信(请参阅 JMS transport security, Part 1,了解有关客户端模式和绑定模式之间的差异)。如果不能保证 WebSphere MQ 的通信安全,将可能使 WebSphere MQ 暴露在未经身份验证的非法远程访问之下。

WebSphere Application Server V6 可通过以下两种方式之一连接到 WebSphere MQ:

  • 在 WebSphere Application Server 管理控制台中将 WebSphere MQ 设置为 JMS 提供程序,这在您需要链接到现有的大型 WebSphere MQ 基础设施时非常有用。
  • 使用 WebSphere Application Server 服务集成总线和 MQLink

本文将探讨第一种方式,在第 2 部分中将介绍后一种。(同时,请参阅 This introduction to the service integration bus。)

有关加强 WebSphere Application Server 安全性的一般信息,请参阅 WebSphere Application Server V6 advanced hardening

先决条件

本文假定读者具备 WebSphere Application Server Network Deployment 的概念和配置及 WebSphere MQ 的概念和配置的基本知识,并对 SSL 和安全性概念有基本的了解(请参阅 Configuring SSL Connections between JMS Clients and the WebSphere MQ JMS Provider,特别是有关安全性概念和安全套接字的部分)。

本文中所介绍的步骤已在 Windows® 环境中使用 WebSphere Application Server Network Deployment V6.0.2 和 WebSphere MQSeries V6.0 与 5.3 进行了测试。我们的设置步骤主要面向 WebSphere MQ V6.0,但其中也包含使用 WebSphere MQ V5.3 运行示例程序的信息。您的 WebSphere Application Server 安装版本必须为 V6.0.2 或更新版本,以确保其中包含重要的 JMS 修复程序。此外,还需要安装 WebSphere MQ V6.0 CSD 1,其中也包含运行该示例程序所需的重要修复程序。

安装 WebSphere MQ V6 时需特别注意的事项

在安装和配置 WebSphere MQ 以及设置同 WebSphere Application Server 的连接时,需要特别注意几点:

  • WebSphere MQ V5.3 和 V6 不能共存。安装 WebSphere MQ V6.0 时,它将覆盖 WebSphere MQ 的任何现有旧版本。

  • WebSphere MQ V6 的管理用户界面为 Eclipse 插件,因此在安装 WebSphere MQ V6 之前必须预先安装 Eclipse 3.0 SDK。Eclipse 3.0 SDK 位于安装光盘的 image/prereqs/IES 目录下。

  • 安装 WebSphere MQ CSD 1 或更高版本。

  • 尽管在 WebSphere Application Server V6 System Management and Configuration Handbook 中建议使用 WebSphere Application Server V6 附带的 WebSphere MQ V5.3 客户端 JAR 文件(位于 ${WAS_INSTALL_ROOT}/lib/WMQ 目录中),但您仍然需要在 WebSphere Application Server 中将环境变量 MQ_INSTALL_ROOT 指向您的 WebSphere MQ V6 安装根目录,以便能使用 V6 客户端 JAR 文件。(V5.3 JAR 不能发送 JMS 消息。)您可在 WebSphere Application Server 管理控制台中的 Environment => WebSphere Variables 下设置此环境变量。

解决方案概述

保证 WebSphere Application Server 和 WebSphere MQ 之间连接的安全需要许多具体细致的步骤。由于这些步骤较为繁琐,因此我们将首先列出方法要点,然后再详细进行介绍。

本质上,我们要实现的目标相当简单:即我们想让 WebSphere MQ 只接受经过身份验证的 SSL 连接。这样,我们就能保证只有可信方才能连接到 WebSphere MQ。要实现这一点,我们需要配置 WebSphere Application Server 以使用 SSL 连接(包括客户端证书)来连接到 WebSphere MQ。在使用 SSL 通信路径时,我们必须确保通信通道的各方:

  • 拥有个人证书
  • 并拥有对等方的个人证书所对应的签名证书。

这样,在 WebSphere Application Server 与 WebSphere MQ 的通信中,当 WebSphere MQ 标识自己的身份时,WebSphere Application Server 将能够验证相应的证书,反之亦然。我们通过两个步骤来限制我们所接受的证书:

  • 通过限制可信签名者的数量
  • 通过指定所期望的准确证书主题。

除此之外都是大量的细节内容,因此注意不要迷失方向。为帮助理解,这里列出了整个过程中的主要步骤,并将在本文的其余部分进行介绍:

  1. 安装示例应用程序。(示例应用程序仅作为演示目的,并不代表 JMS 应用程序的实际生产质量。)
  2. 配置 WebSphere MQ 和 WebSphere Application Server 以启用通信。此时,这种通信并不安全。
  3. 为 WebSphere MQ 和 WebSphere Application Server 创建个人证书,以便它们能使用 SSL 进行通信并通过证书进行身份验证。
  4. 在不同的密钥和信任存储区中分享签名证书。
  5. 配置 WebSphere MQ(V5.3 和 V6.0)以接受 SSL 请求并拒绝非 SSL 连接。
  6. 配置 WebSphere MQ 以接受来自特定客户端的请求,在本例中为 WebSphere Application Server。
  7. 配置 WebSphere Application Server 以使用更新的密钥存储区。(如果 WebSphere Application Server 已经更改成不使用缺省缺省的密钥存储区,则无需执行此步骤。)无论 WebSphere Application Server 使用何种证书,都必须确保在 WebSphere MQ 的密钥存储区中存在对应的签名者。
  8. 更新 WebSphere Application Server 的消息传输配置以使用 SSL。
  9. 测试结果。

安装示例应用程序

我们在本文中所使用的示例应用程序非常简单,即提交一条 JMS 消息并浏览队列内容。该应用程序包含在 JmsTestEAR.zip 下载文件中。

我们的示例应用程序包含以下组件:

  • BrowseAq.jsp 使用 ConnectionFactory 引用 jms/SendCFRef 和队列引用 jms/destQRef 来显示 JMS 队列的内容。
  • SendMsg servlet 通过 ConnectionFactory 引用 jms/SendCFRef 和队列引用 jms/destQRef 来调用无状态会话 Bean (MessageSender) 以发送一条 JMS 消息。

要安装示例应用程序,请执行以下步骤:

  1. 更新 MQ 安装根目录变量。

    1. 启动应用服务器,并登录到 WebSphere Application Server 管理控制台。
    2. 定位到 Environment => Manage WebSphere Variables
    3. 编辑变量 MQ_INSTALL_ROOT 以使其指向 MQSeries 客户端的根目录,例如 C:\Program Files\WebSphere MQ。(有关配置 WebSphere 变量的详细信息,请参阅 WebSphere Application Server Information Center。)
  2. 在 WebSphere MQ JMS 提供程序下创建名为 SendCF 的 ConnectionFactory,其 JNDI 名称为 jms/SendCF。(确保在单元 (cell) 范围或与您的应用服务器节点相适应的范围下创建该资源。控制台中显示的缺省范围为部署管理器节点的范围。)这里的主要字段为:

    • Queue manager name:设置成远程 WebSphere MQ 队列管理器的名称。
    • Host:队列管理器计算机的 TCP/IP 主机名
    • Port:通常为 1414
    • Channel:MQ 服务器连接通道的名称。

    如果没有为通道指定任何内容,则其缺省值为 SYSTEM.DEF.SVRCONN。传输类型应更改为 CLIENT。即使队列管理器与 WebSphere Application Server 运行在同一计算机上,您也必须使用客户端模式来进行通信,这是因为绑定模式并不支持 SSL 连接。(请参见图 1 和 2。)

    图 1. 以 MQ 作为 JMS 提供程序 ConnectionFactory
    以 MQ 作为 JMS 提供程序 ConnectionFactory
    以 MQ 作为 JMS 提供程序 ConnectionFactory
    图 2. ConnectionFactory 设置 NonSSL
    ConnectionFactory 设置 NonSSL
    ConnectionFactory 设置 NonSSL
  3. 在队列管理器中创建物理队列 FROMWASQ。

    1. 在队列管理器计算机上,确认队列管理器和侦听器已经启动。
    2. 使用 runmqsc 或 WebSphere MQ Explorer 创建名为 FROMWASQ 的队列。通过 WebSphere MQ Services 可查看到侦听器的状态和端口号。
  4. 在 WebSphere Application Server 中创建 FROMWASQ 管理的对象。在 WebSphere MQ JMS 提供程序中创建名为 FROMWASQ 的队列,其 JNDI 名称为 jms/destQ。基本队列名称为 FROMWASQ(在 MQ 中的名称)。您无需输入任何其他字段。(请参见图 3 和 4。)

    图 3. 创建 MQ JMS 队列目的地
    创建 MQ JMS 队列目的地
    创建 MQ JMS 队列目的地
    图 4. MQ 提供程序队列目的地
    MQ 提供程序队列目的地
    MQ 提供程序队列目的地
  5. 安装应用程序。

    1. 下载 ZIP 文件中安装 JmsTestEAR.ear,使用应用程序安装向导,并接受所有选项的缺省设置。注意,如我们上面所定义的那样,缺省的绑定将 jms/SendCFRef 设置为 jms/SendCF ConnectionFactory,将 jms/destQRef 设置为 jms/destQ 队列。如果得到警告消息提示 The resources that are assigned to the application are beyond the deployment target scope,请忽略该消息并单击 Continue
    2. 安装结束后,保存您的更改并重新启动服务器,以使配置更改生效。
  6. 测试应用程序

    1. 从 Web 浏览器中使用以下 URL 打开应用程序:http://localhost:9080/JmsTestWeb/BrowseAq.jsp。系统将显示出类似于图 5 的页面。该页面中显示 FROMWASQ 队列的内容,允许您向该队列提交 JMS 消息。
    2. 选择 Send a JMS Message,然后确认消息发送成功,如图 6 所示。
    3. 选择 Browse Input Queue 以查看队列的新内容。

    该测试可检查使用 WebSphere MQ 作为 JMS 提供程序时 WebSphere Application Server 和 WebSphere MQ 之间的连接情况。

    图 5. 浏览队列
    浏览队列
    浏览队列
    图 6. SendMsg 页面
    SendMsg 页面
    SendMsg 页面
  7. 启用 WebSphere Application Server 全局安全性(如果尚未启用)。

    本文的其余部分将使用在 DefaultSSLSettings SSL 指令表中定义的密钥和信任存储区。当 WebSphere Application Server Network Deployment (ND) 环境中启用了 WebSphere Application Server 全局安全性时,需要用到这些密钥和信任存储区。要启用全局安全性,请参阅 WebSphere Application Server Information Center

    如果您不是在 WebSphere Application Server ND 环境中测试该应用程序,则需要设置以下 JVM 自定义属性,以指向在本文后面定义的密钥和信任存储区:

    • javax.net.ssl.keyStore
    • javax.net.ssl.keyStorePassword
    • javax.net.ssl.trustStore
    • javax.net.ssl.trustStorePassword

    请参阅 Using the Java Secure Socket Extension in WebSphere Application Server 以了解该设置的必要性。

SSL 密钥存储区和信任存储区设置概述

在我们年的示例中,WebSphere Application Server 为 SSL 握手中的“客户端”,而 WebSphere MQ 则为“服务器”。对于 WebSphere MQ 服务器证书,我们将从 VeriSign 获得名为 ibmwebspheremqqm_example 的试用证书。对于 WebSphere Application Server,我们则使用一个自签署证书,名为 jmsclient。我们将同时进行服务器和客户端的身份验证。客户端身份验证将确保只有那些能证明其身份的客户端(在本例中仅为 WebSphere Application Server)才能连接到队列管理器。如果不进行客户端身份验证,则网络上的任何应用程序都可以从 WebSphere MQ 队列管理器中提交或接收消息。

下表列出了我们将在每个节点上设立的密钥存储库及其所包含的构件:

部署管理器应用服务器WMQ 队列管理器

密钥存储区

  • jmsclient 自签署证书和私钥

信任存储区

  • jmsclient 自签署证书(公钥)
  • VeriSign 试用 CA 证书

密钥存储区

  • jmsclient 自签署证书和私钥

信任存储区

  • jmsclient 自签署证书(公钥)
  • VeriSign 试用 CA 证书

组合密钥存储区/信任存储区

  • jmsclient 自签署证书(公钥)
  • VeriSign 试用 CA 证书
  • 队列管理器的服务器证书由 VeriSign 签发,标记为 ibmwebspheremq<您的队列管理器名称 >

请注意:

  • 在这些密钥存储库中可能存在其他构件(证书和密钥),而该表仅列出了我们的示例应用程序所需的那些构件。

  • 这里的节点为逻辑实体;我们的示例应用程序非常简单,这三个节点可位于同一台计算机上。

  • 为简便起见,我们选择对 WebSphere Application Server 使用自签署证书,而对 WebSphere MQ 则使用 CA 签发的证书。这并不是必须的,您也可以为通信连接双方选择其他类型的证书。

对于本例中的 WebSphere Application Server,使用信任存储区来验证(公钥),而使用密钥存储区来验证私钥(公钥/私钥对)。在本例中,我们将使用 DefaultSSLSettings 指令表(配置),但会更改密钥存储区和信任存储区的缺省名称。DummyServerKeyFile 和 DummyServerTrustFile 中包含的是对所有 WebSphere Application Server 安装通用的示例服务器密钥,不能用于生产环境中。

在不同位置上,WebSphere Application Server 部署管理器和节点代理通过 SSL 连接进行相互通信。如所期望的那样,当客户端打开到服务器的连接时(WebSphere Application Server 缺省情况下不使用客户端身份验证),将执行服务器身份验证。例如,当部署管理器访问某个节点代理时,节点代理向部署管理器提供证书 (jmsclient),部署管理器按通常方式对照其信任存储区来验证证书(具体来说,它将查找 jmsclient 签名者)。这就是为什么我们要更新 WebSphere Application Server 密钥环以确保它们在初次握手期间仍然能够正常工作的原因。

WebSphere MQ SSL 握手流程:

  1. 当初始化 JMS 连接工厂时,WebSphere Application Server 打开到 WebSphere MQ 的 SSL 连接,这将发送其 jmsclient 证书。

  2. WebSphere MQ 队列管理器使用队列管理器密钥存储区中的 jmsclient 公钥对 WebSphere Application Server 的客户端证书进行验证。

  3. WebSphere MQ 使用通道中的 SSLPEER 属性来检查其能接受的客户端证书专用名称 (DN) 值。在本例中,WebSphere Application Server 客户端证书匹配 DN cn=jmsclient、ou=ISSW、o=IBM 和 c=US(在 SSLPEER 属性中列出,因此它是 WebSphere MQ 的可信身份)。如果没有设置 SSLPEER,则 WebSphere MQ 可接受 VeriSign 试用 CA 所签发的任何其他客户端证书。

  4. 队列管理器将由 VeriSign 试用 CA 所签发的服务器证书发送给 WebSphere Application Server。

  5. WebSphere Application Server 接收到 WebSphere MQ 服务器证书后,在其信任存储区内进行查找,并使用 VeriSign 试用 CA 证书来验证该服务器证书。如果在 WebSphere Application Server 连接工厂中设置了 SSL 对等方名称,则它必须同 WebSphere MQ 证书的 DN 匹配。

  6. SSL 握手到此完成。

获得数字证书

如前面所提到的,我们将使用从 VeriSign 获得的演示证书来进行 WebSphere MQ 服务器身份验证,而使用自签署证书来进行客户端身份验证。

证书保存在不同的存储库中,这取决于具体的操作系统和访问工具。我们使用 IBM 密钥管理工具 ikeyman,该工具可用于证书的存储和检索。

VeriSign 是提供演示证书的证书颁发机构。接下来,我们将通过一系列步骤来为 WebSphere MQ 队列管理器获取证书。(如果您已具有队列管理器证书,可继续使用并跳至下一部分

要从 VeriSign 获取演示证书,您必须首先生成证书签名请求 (CSR)。有关如何生成 CSR 的说明,可在 VeriSign 网站上找到,同时在 WebSphere Application Server 中也多次进行了介绍。注意,我们假设您安装的是 WebSphere Application Server Network Deployment,否则您的缺省密钥存储区的行为可能有所不同。(有关更多信息,请参阅 Using the Java Secure Socket Extension in WebSphere Application Server)。

  1. 打开 WebSphere MQ Explorer 并右键单击 IBM Websphere MQ,然后选择 Manage SSL Certificates,从而启动密钥管理工具 ikeyman。

  2. 我们将使用缺省的密钥数据库位置:<mqroot>\Qmgrs\<qmgrname>\ssl。其缺省名称为 key.kdb。选择 Key Database File => New 可创建密钥数据库文件。

  3. 接受缺省的 CMS 密钥数据库类型。

  4. 对于密钥数据库位置,可浏览至 <mqroot>\Qmgrs\<qmgrname>\ssl\ 目录并将该文件命名为 key.kdb (图 7)。

    图 7. 为队列管理器创建新的密钥数据库
    为队列管理器创建新的密钥数据库
    为队列管理器创建新的密钥数据库
  5. 单击 OK ,出现提示后输入正确的密码。选择将密码隐藏在在文件中的选项。

  6. 选择 Create => New Certificate Request。系统将显示“Create New Key and Certificate Request panel”面板。(图 8)。

  7. 输入密钥标签名称值,如: ibmwebspheremq<yourqmgrname_inlowercase>。这将作为证书名称。再为“Common Name”(您的主机+域名)、“Organization”以及其他标记为可选的字段输入相应的值。您可使用缺省密钥大小 (1024)。输入文件名并保存请求,或者保留缺省名称 certreq.arm。如果您使用的是 WebSphere MQ V6,则证书标签名称必须遵守此约定,否则队列管理器将不知道您使用哪一种服务器证书。

    图 8. ikeyman 证书请求对话框
    ikeyman 证书请求对话框
    ikeyman 证书请求对话框

    尽管该工具将某些字段列为可选,但它们对 VeriSign 而言是必须提供的。如果没有提供这些字段值,您可能得到错误消息,例如:Error 9508 - Certificate Signing Request contains empty field(s)。(您可能还需要提供省/市/自治区的名称。如果输入诸如 TX 之类的州名称,可能会被 VeriSign 视作无效,这时您将接收到错误消息 The state value used in the submitted CSR is not valid

  8. 使用不会添加任何额外字符的文本编辑器(如记事本)来打开 CSR 文件 (certreq.arm)。我们将在后面演示证书注册的过程中使用该文件的内容。

现在我们已经生成了 CSR,我们将用它来请求演示证书。

  1. 在 Web 浏览器中,打开 URL:http://www.verisign.com/products-services/security-services/ssl/buy-ssl-certificates/free-trial/index.html。

  2. 在 Verisign Free SSL Certificate Trial 页面上,单击 Try Now (图 9)。

    图 9. 获取 VeriSign 试用证书
    获取 VeriSign 试用证书
    获取 VeriSign 试用证书
  3. 单击 Continue。在接下来的面板上,填写技术联系信息。证书将被发送到您所提供的电子邮件中。再次单击 Continue

  4. 在“Enter Certificate Signing Request”表单上,为“Select Server Platform”选择 Server not listed,然后将 certreq.arm 的内容粘贴到文本区域(图 10)。

    图 10. 粘贴证书签名请求
    粘贴证书签名请求
    粘贴证书签名请求
  5. 输入不同于服务器私钥密码且难于记忆的短语,然后单击 Continue

  6. 确认 CSR信息并单击 Accept

  7. 您将在一小时内接收到一封电子邮件,内附有关获取 14 天试用证书的信息。由于这是试用证书,因此您需要将测试 CA 根证书安装到您的信任存储区中,以便稍后在服务器中使用。按照电子邮件内的链接获得测试 CA 根证书。

  8. 我们不会把该证书导入至 Web 浏览器,而是继续使用 ikeyman,因此请按照链接进入 Secure Site Trial CA Root Certificate,并将证书内容保存在 .cer 文件中(例如:TrialCARoot.cer)。

  9. 将 VeriSign 发送给您的证书内容保存到 .cer 文件中(例如:MQServer.cer)。该证书内容置于 VeriSign 发送的电子邮件底部,介于以下字符串之间:

    -----BEGIN CERTIFICATE-----

    -----END CERTIFICATE-----

  10. 返回到 ikeyman 以导入试用 CA 根证书。请记住,要成功地使用来自 VeriSign 的证书,您必须将 VeriSign 演示根证书和电子邮件发送的证书都导入到您从中生成证书请求的密钥文件中。如果您试图将 VeriSign 证书导入到未包含证书请求的密钥文件,则 Ikeyman 将提示错误。从下拉选项卡中选择 Signer Certificates => Add

  11. 接受缺省的“Base 64 encoded ASCII Data”的数据类型。

  12. 浏览至 TrialCARoot.cer 文件的位置并选择 OK

  13. 对于证书标签,请输入有意义的文字,例如:VeriSign Test CA Root

  14. 现在,您的证书将会出现在“Signer Certificates”下方(图 10)。您最好这时从您的信任存储区中删除所有其他签名者证书,因为每个签名者证书都意味着发出一种信任关系。

    图 11. ikeyman 测试 CA 根证书
    ikeyman 测试 CA 根证书
    ikeyman 测试 CA 根证书
  15. 导入 WebSphere MQ 服务器证书。从下拉选项卡中选择 Personal Certificates => Receive 。接受缺省数据类型,然后浏览至 MQServer.cer 文件位置。单击 OK。现在,该证书将出现在“Personal Certificates”下方。

创建新的密钥存储区、信任存储区和自签署客户端证书

如果您已拥有 WebSphere Application Server 证书(不是示例服务器证书),请跳过该部分并使用您当前的证书。

我们将创建新的密钥存储区和信任存储区,而不是使用缺省的 DummyServerKeyFile.jks 和 DummyServerTrustFile.jks,因为使用这些缺省库不是好的安全做法。

  1. 启动 <was root>\bin\ikeyman.bat,打开 WebSphere Application Server 附带的 ikeyman 版本。

  2. 从 ikeyman 菜单中,选择 Key Database File => New

  3. 在“Open”对话框中,接受缺省的密钥数据类型值 JKS (Java™ 密钥存储区)。

  4. 将文件保存为 <wasroot>\profiles\AppServer01\etc 目录下的 WASServerKeyFile.jks

  5. 当提示创建密钥存储区密码时,请选择正确的密码并进行确认。

  6. 从“Signer Certificates”选项卡中删除所有签名者证书。如前面所提到的,限制签名者可减少风险。

  7. 切换到 Personal Certificates,并单击 New Self-Signed

  8. 在“Create New Self-Signed Certificate”对话框(图 12)中输入同您的应用服务器位置相符的值。将密钥标签设置为您所选的值。

    图 12. 创建自签署证书
    创建自签署证书
    创建自签署证书

    现在 jmsclient 证书将出现在 ikeyman “Personal Certificates”选项卡下方。

导出自签署证书

现在,我们已经为 WebSphere Application Server JMS 客户端创建了自签署证书(私钥和证书对)。我们需要提取 jmsclient 证书,并将其放在 WebSphere Application Server 和 WebSphere MQ 的信任文件中,以便它们可以将其用作签名者。

  1. 首先,我们将导出个人证书。在 ikeyman 数据库打开 WASServerKeyFile 并选中 jmsclient 证书的情况下,单击 Extract Certificate。这仅会导出证书(而不包含私钥)。保存证书并对其适当命名,例如:was_jms_client.arm

  2. 在将 WASServerKeyFile 用于私钥的同时,我们还需要一个信任文件以便用于验证签名者。现在,我们将创建该文件,并将其命名为 WASServerTrustFile。使用 ikeyman,选择 Key Database File => New 并将其命名为 <wasroot>\profiles\appserver01\etc\WASServerTrustFile.jks,从而创建新的密钥数据库。

  3. 切换到 Signer Certificates 选项卡并删除所有多余的签名者。

  4. 将 jmsclient 证书导入到 WebSphere Application Server 信任存储区中:切换到 Signer Certificates 选项卡,按 Add 按钮,浏览至您保存 was_jms_client.arm 的位置,然后导入证书。

  5. 将 jmsclient 证书导入到 WebSphere MQ 信任存储区中:使用 ikeyman 打开 <mq root>\qmgrs\<your qm>\ssl\key.kdb,切换到 Signer Certificates 选项卡,按下 Add 按钮,浏览至 was_jms_client.arm,然后导入证书。

  6. 切勿忘记,我们还需要将 VeriSign 测试根 CA 证书导入到 WebSphere Application Server 信任存储区中,以便应用服务器能在 SSL 握手期间验证队列管理器证书。再次使用 ikeyman 打开 WASServerTrustFile,浏览至您保存 TrialCARoot.cer 的位置,然后导入该证书。

祝贺您!现在,您的应用服务器密钥和信任文件的所有证书都已处于正确的位置。为了确认,您的应用服务器密钥文件中应包含 jmsclient 证书,同时应用服务器信任文件中应包含两个签名者证书,如图 13 所示。

图 13. WASServerTrustFile
WASServerTrustFile
WASServerTrustFile

为 WebSphere MQ V6 队列管理器配置 SSL

  1. 在 WebSphere MQ Explorer 中,启动您的队列管理器。

  2. 右键单击 <queue manager> => Properties => SSL

  3. 在 SSL 属性中,确认密钥存储库的位置是否与您的密钥数据库名称和位置相符。例如:C:\Program Files\IBM\Wmq\qmgrs\QM_EXAMPLE\ssl\<key>。这里 <key> 为数据库名称。在 ssl 目录下应该存在四个文件:

    • key.kdb
    • key.sth
    • key rdb
    • Key。

此时,MQ 密钥存储库中除 WebSphere Application Server 签名证书和 VeriSign 测试证书(在生产性环境下不会出现在这里)的签名者外,已无其他签名者。

为 SSL 配置 WebSphere MQ V6 队列管理器

由于 WebSphere MQ V5.3 Windows 版本的密钥存储区格式与 ikeyman 不兼容,因此如果您使用的是 WebSphere MQ V5.3 Windows 版本,则需要执行这些步骤。而且,WebSphere MQ V5.3 Windows 版本的证书标签也并不需要一定为 ibmwebspheremq<yourqmgrname_inlowercase>。

  1. 使用 ikeyman 打开前面用于导入 VeriSign 试用证书(key.jks)的密钥存储库(如果您在前面已将其关闭)。

  2. 从下拉列表中选择 Personal Certificates,然后选择由 VeriSign 提供的演示证书。

  3. 按下 Export/Import 按钮,选择操作类型 Export Key,将密钥文件类型更改为 PKCS12,然后浏览至某个位置以保存您的私钥(例如,MQServer_privateKey.p12)。

    图 14. WebSphere MQ 5.3 导出 Verisign 私钥
    WebSphere MQ 5.3 导出 Verisign 私钥
    WebSphere MQ 5.3 导出 Verisign 私钥
  4. 提供密码以保护您的私钥文件。

  5. 从 WebSphere MQ Explorer 中,右键单击您的队列管理器,并选择 Properties

  6. SSL 选项卡中,按下 Manage SSL Certificates 按钮。

  7. 选择当前未使用的所有证书(在本例中选择全部证书),并将其从密钥存储区中删除。这样做是为了将 WebSphere MQ 信任域限制到特定客户端,这些客户端必须能提供具有我们所期望的签名者的证书,在本例中为:WebSphere Application Server。

  8. 按下 Add

  9. 选择 Import from a file 并浏览至保存私钥文件 MQServer_privateKey.p12 的位置。选择该私钥文件并输入您在前面提供的密码。

  10. 选择来自 VeriSign 的 MQServer 证书,并按下 Assign 按钮。

  11. 在接下来的对话框中,再次选择 MQServer 证书并按下 Assign 然后再按下 OK。现在您已经为您的 MQ 5.3 队列管理器指定了 VeriSign 私人证书。

  12. 要添加 WebSphere Application Server 客户端签名者,可单击 Add 按钮,然后选择 Import from a file,浏览至 was_jms_client.arm 并添加证书。

  13. 继续执行以下的步骤以配置您的通道。

配置 MQ SSL 通道

接下来,我们将配置 JMS 客户端用于同队列管理器进行安全 SSL 通信的通道:

  1. 在 MQ Explorer 中,选择您的队列管理器,然后选择 Advanced 文件夹,再选择 Channels 文件夹,并单击右键。选择 New => Server Connection Channel

  2. 在接下来的对话框中,输入通道名称(在本例中我们使用 SSL.SVRCONN),然后单击 Next

  3. 切换到 SSL 选项卡视图,并指定密码规范。在本例中,我们将使用 RC4_MD5_US,但您在实际应用的过程中应评估所在组织的安全需要,并根据情况考虑使用其他具有更高强度的密码。注意,初始化连接的各方身份验证的缺省设置为“Required”(图 15)。

    图 15. 指定新的服务器连接通道
    指定新的服务器连接通道
    指定新的服务器连接通道
  4. 我们需要防止队列管理器接受来自只拥有队列管理器密钥存储区中的某个 CA 所签发证书的任何客户端的证书。要做到这一点,我们需要设置通道上的 SSLPEER 参数。该参数用于检查来自位于 WebSphere MQ 通道另一端的客户端的证书专有名称 (DN)。如果从客户端接收到的 DN 与 SSLPEER 值不符,则通道将不会启动。要设置此参数,请选中 Only accept certificates with Distinguished Names matching these values,然后输入与客户端证书匹配的 DN 值,如图 16 中所示。在我们的示例中为:CN=jmsclient,OU=issw,O=ibm,C=US(基于我们生成自签署的客户端证书的方式)。

现在我们已经配置好服务器连接通道,JMS 客户端将使用此通道来与队列管理器进行通信。如果您尚未进行配置,则需要强制所有通道都要求 SSL 连接(或删除通道),包括如 SYSTEM.DEF.SVRCONN 之类的通道。

证书安全性警告

由于您为 WebSphere MQ 配置使用证书密钥存储区,请记住在密钥存储区中每个签名证书都代表您和证书签名者(通常为 CA)之间的信任关系。在最基本的情况下,如果将任何签名证书放入 WMQ Server 密钥存储区中而缺少 DN 验证,则意味着 WebSphere MQ 应该接受来自任何具有该 CA 签发的证书的一方的所有连接。除非您使用的是自签署证书或具有专门用于 WebSphere MQ 的 CA,否则根本不安全。因此,我们将证书限制在那些具有我们指定的匹配 DN 值的范围中。这可确保证书中的身份与我们期望的身份是相同的。但是,这里存在一个例外。如果两个 CA 签发了具有相同 DN 的证书,我们安全性机制将无法起作用。这种情况通常不应该出现,因为著名的 CA 都不会这样做。但是不同的 CA 可能会签发具有相同主题的证书,这也正是为什么您需要将其他所有证书都删除掉而只保留来自您所期望的 CA 的证书的原因。

配置 WebSphere Application Server JMS 客户端

这一部分介绍如何将 WebSphere MQ 配置成 JMS 提供程序。另外一种将 WebSphere Application Server V6 连接到 WebSphere MQ 的方式是使用服务集成总线,这将在第 2 部分中介绍。

当 WebSphere MQ 被配置成 JMS 提供程序时,它将对应用服务器使用缺省的密钥和信任存储区。如果在 WebSphere Application Server ND 单元中启用了全局安全性,则将在缺省的 SSL 指令表配置中设置缺省的密钥和信任存储区。

将密钥和信任文件分发到其他节点

现在我们需要将应用服务器 WASServerKeyFile 和 WASServerTrustFile 复制到部署管理器节点以及单元中的任何其他应用服务器节点上。这样,当某个应用服务器同其他应用服务器或部署管理器进行通信时,该应用服务器将从密钥文件中提供新的 jmsclient 证书给其他方,对方将对照其信任文件再次进行验证。

服务器密钥文件必须包含准确的个人密钥,以便当任何 WebSphere Application Server 组件尝试接受来自其他方的 SSL 连接时,它都具有唯一的身份可供使用。单元中的所有其他信任存储区中都必须包含对应的签名者。由于 appserver01 节点的密钥文件被修改而使用新的个人密钥,这意味着部署管理器在初始化到服务器的连接时必须提供对应的签名者。如果服务器初始化到部署管理器的连接,则服务器需要拥有对应于部署管理器个人密钥的签名者(它们事先已拥有)。

将应用服务器 WASServerKeyFile.jks 和 WASServerTrustFile.jks 直接复制到部署管理器和其他节点是实现该要求的最简便方法。将这些文件复制到 <was_root>\profiles\dmgr\etc 和单元中的任何其他应用服务器节点的配置文件目录。

现在,我们需要编辑 WebSphere Application Server 的缺省 SSL 配置以指定我们所创建的新文件:

  1. 在 WebSphere Application Server 管理控制台中,定位到 Security => SSL。您将看到两个 SSL 配置 (DMNode/DefaultSSLSettings 和 <yourAppServernode>/DefaultSSLSettings),如果您拥有其他节点,则会看到更多的配置。

  2. 选择 DMNode/DefaultSSLSettings。将密钥文件名更改为 ${USER_INSTALL_ROOT}/etc/WASServerKeyFile.jks,并将信任文件名更改为 ${USER_INSTALL_ROOT}/etc/WASServerTrustFile.jks。将密钥文件密码和信任文件密码更新为您所选定的值,如图 16 中所示。

    图 16. 更新 DefaultSSLSettings 配置表
    更新 DefaultSSLSettings 配置表
    更新 DefaultSSLSettings 配置表
  3. 完成后,单击 Apply

  4. 对您的应用服务器节点进行相同的 SSLSettings 更改。完成后,保存更改。

  5. 您将需要重新启动部署管理器、节点代理和您的应用服务器,以便使更改生效。

如果您正在使用任何客户端程序(例如 wsadmin 或 J2EE 客户端),则需要更新所有节点上的客户端信任文件(缺省设置为 DummyClientTrustFile)以包含 jmsclient 证书,不过在我们的示例中不必如此。不同的客户端使用不同的配置文件:基于 IIOP 的客户端(例如 J2EE 客户端)使用 sas.client.props 文件;基于 SOAP 的客户端(例如 wsadmin)使用 soap.client.props。如果您正在使用任何客户端应用程序,则需要编辑其配置文件以指定已修改的 trustStore 信息。您需要找到相应的文件(在每个节点的配置文件目录下),然后查找并编辑下列属性以适应您的环境:

com.ibm.ssl.trustStore=
  C:/Program Files/IBM/WAS6/profiles/Appserver01/etc/DummyClientTrustFile.jks
com.ibm.ssl.trustStorePassword={xor}CDo9Hgw\=

您将需要指定新的客户端信任文件名称(需要使用 ikeyman 创建该文件)以及该信任文件的密码。您可以使用 PropFilePasswordEncoder 来对属性文件中的密码进行编码,有关详细信息请参阅 WebSphere Application Server Information Center

既然我们已经建立了密钥文件并编辑了 SSL 配置,我们就需要配置 WebSphere Application Server 和 WebSphere MQ 侧的 SSL。

定义 ConnectionFactory 并将对象排入 WebSphere Application Server 队列中。

从 JMS 客户端的角度来看,客户端代码并不关心是否使用 SSL 连接。SSL 配置是在 ConnectionFactory 的定义中完成的。我们现在将更新前面所创建的使用 SSL 的 MQ 连接工厂。

  1. 展开 Resources => JMS Providers => WebSphere MQ。在“Additional Properties”下,选择 WebSphere MQ connection factories(图 17)。

    图 17. WebSphere MQ 连接工厂
    WebSphere MQ 连接工厂
    WebSphere MQ 连接工厂
  2. 选择现有的 SendCF ConnectionFactory 以便进行更新。

  3. 更新队列管理器、端口和通道以与 WebSphere MQ 中定义的安全服务器连接匹配。滚动到 ConnectionFactory 属性中部,并将 SSL 密码套件设置为 SSL_RSA_WITH_RC4_128_MD5。(再次说明,请评估您的安全需要并考虑使用强度更高的密码。)

  4. 为确保您使用正确的 WebSphere MQ 实例进行通信,请将 SSL 对等方名称值设置为 MQ Server 证书的 DN,例如:

    CN=ibmwebspheremqqm_example, OU=Terms of use at www.verisign.com/cps/testca (c)05, 
    OU=ISSW, O=IBM, L=Dallas, ST=Texas, C=US

    然后选择 OK。(如果您无法确定 DN,则可在测试应用程序并且 SSL 握手失败之后,检查应用服务器的 SystemOut.log 并找到非常有用的 MQException:

    MQJE067: Peer name CN=.. , C=US did not match requested name CN=

    您还以可使用 ikeyman 来查看证书的完整 DN。)

  5. 如果没有设置 SSL 对等方名称,WebSphere Application Server 将不会验证 WebSphere MQ 的证书,而连接到可提供任何有效证书的任何服务器。

    图 18. ConnectionFactory SSL 更新
    ConnectionFactory SSL 更新
    ConnectionFactory SSL 更新
  6. 如果安全队列管理器中没有所定义的名为 FROMWASQ 的队列,则可以选择名为 FROMWASQ 的 WebSphere MQ 队列目的地并更改基本队列名称来对其进行更新,以便与安全的 QueueManager 上的队列匹配。

  7. 保存设置并重新启动应用服务器以使配置更改生效。JmsTestEAR 应用程序将保持映射到 JMS 资源 jms/SendCF 和 jms/destQ。

测试示例应用程序

现在所有的设置均已完成,您可以重新启动 WebSphere Application Server 并测试应用程序,方法与前面相同,请使用 URL: http://localhost:9080/JmsTestWeb/BrowseAq.jsp.

如何确认 SSL 正在工作:

如果您通过 WebSphere Application Server 管理控制台更改 ConnectionFactory jms/SendCF,而不再包含 SSL 密码套件(或使用另外的密码套件),则在重新启动您的应用服务器后,将得到一个 JMS 连接错误,这是因为客户端和队列管理器之间的握手会失败。

确认客户端身份验证正在工作:

如果您从队列管理器的信任存储区中删除公钥(在签名者证书下,删除 was_jms_client),您会再一次得到 JMS 连接错误。

要确认客户端证书身份验证(特定证书被接受),可以在 SSL 选项卡中将通道 DN 更改成不同于您的证书上的 DN 的值。该证书不应该被接受。

在 Windows 环境中配置 WebSphere MQ V5.3

如果您使用的是 WebSphere MQ V5.3 而不是 WebSphere MQ V6.0,则需要进行以下更改:

  1. 为每个节点更新 MQ_INSTALL_ROOT 环境变量,使其指向您的 WebSphere MQ V5.3 安装目录。

  2. 由于 WebSphere MQ V5.3 不使用 ikeyman 来配置其密钥和信任存储区,因此需要使用 WebSphere Application Server ikeyman 来创建 Verisign 证书请求。在导入 VeriSign 证书以及随后导出证书的操作中,必须使用与创建请求相同的数据库。当使用 V5.3 时,对 WebSphere MQ 证书的标签名称没有任何限制。

  3. WebSphere MQ V5.3 Explorer 可用于管理安全队列管理器的 SSL 证书。从队列管理器属性中,选择 SSL 选项卡和 Manage SSL Certificate。删除其中现有的全部证书,然后添加 VeriSign 个人证书和 was_jms_client 公钥。将 VeriSign 证书指定给队列管理器。

疑难解答

  • 您可在应用服务器的 JVM 自定义属性中添加以下属性来启用 SSL 握手日志记录功能:javax.net.debug=true。应用服务器的 SystemOut.log 将包含 SSL 交换信息,如果启用了全局安全性,则您可以获得更多的日志信息。

  • 如果您在“可疑”事务的回滚操作中遇到问题,并且 WebSphere Application Server 无法连接到 WebSphere MQ(在测试系统中),可尝试删除应用服务器中的 tranlog 目录,然后重新启动应用服务器,并查看在没有预先事务问题的情况下,WebSphere MQ SSL 连接能否建立。可疑事务可能是其他问题的症状,仍然需要进行调查。

  • 如果您在启动 WebSphere Application Server 部署管理器或节点代理时接收到以下错误消息:

    org.omg.CORBA.COMM_FAILURE: CAUGHT_EXCEPTION_WHILE_CONFIGURING_SSL_CLIENT_SOCKET: 
    JSSL0080E:
    javax.net.ssl.SSLHandshakeException - The client and server could not negotiate the 
    desired level of security. Reason: com.ibm.jsse2.util.g: No trusted certificate found

    则部署管理器和节点代理中的证书密钥环文件可能不同步,或未使用您所期望的文件。检查 <was_root>\profiles\dmgr\config\cells\<yourcell>\security.xml 和 <was_root>\profiles\AppServer01\config\cells\<yourcell>\security.xml 文件,并确认“SecureSocketLayer_1”keyFileName 和“SecureSocketLayer_xxxx”(其中 x 为数字字符串)keyFileName 的值是否与您在 WebSphere Application Server 管理控制台中为 SSL 配置表密钥和信任文件设置的值相匹配。

结束语

本文阐释了在使用 WebSphere MQ 作为 JMS 提供程序时如何配置 WebSphere MQ 和 WebSphere Application Server 之间的 SSL。第 2 部分将介绍在服务集成总线中使用 MQ 链接时如何配置 WebSphere Application Server V6 和 WebSphere MQ 之间的安全连接。

致谢

在此我们衷心感谢 Keys Botzum、Tom Johnson、Martin Smithson、Graham Hopkins、David Currie、Bobby Woolf 和 Roland Barcia 所提供的广泛的技术协助和专业意见。同时感谢 Kareem Yusuf 撰写了本文的原始初稿。在征得 Kareem Yusuf 许可后,本文中直接使用了其部分内容(有关 SSL 的介绍)。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=163402
ArticleTitle=IBM WebSphere 开发者技术期刊: 保证 WebSphere Application Server 和 WebSphere MQ 之间连接的安全——第 1 部分
publish-date=01182006