内容


配置 JMS 客户机和 WebSphere MQ JMS 提供者之间的 SSL 连接

Comments

© Copyright International Business Machines Corporation 2002. All rights reserved.

引言

现在,安全套接字层(Secure Socket Layer,SSL)协议是许多跨不安全网络(如因特网)实现的安全性的基础。因此,SSL(特别是基于 SSL 的 HTTPS)就成为 J2EE 开发者熟悉的术语了。

IBM® WebSphere® MQ 版本 5.3(以下称 MQ)支持 SSL,SSL 用于保护队列管理器之间的通道以及应用程序和正被使用的队列管理器之间的通道。就 JMS 而言,这意味着使用客户机(基于网络的)传输与 MQ JMS 提供者进行通信的 JMS 客户机(应用程序)可以用 SSL 保护通信。

本文演示了如何配置 JMS 应用程序和运行在 Windows 2000 上的 MQ 队列管理器之间的 SSL 连接。本文引入了 SSL,并且讨论了关键的 SSL 概念(如数字证书和密码规范)。如果您已经熟谙 SSL,那么您可能希望直接跳到 配置 WebSphere MQ SSL部分。我们假定您有使用 WebSphere MQ 和 MQ JMS 的经验,还假设您已经创建了一个队列管理器并且正确地配置了 JMS 环境。如果有必要的话,请参考 相关信息部分以获取详细介绍这些主题的参考资料。

安全性概念

在深入研究 SSL 本身之前,考虑一下网络通信面临的关键的安全性问题以及适当的解决方案,这是很有帮助的。关键的安全性问题包括:

窃听

当未知的人知道了正在通信的双方之间所传递的消息时,就发生了窃听。换言之,您需要阻止未知的人阅读您的消息。为了保护信息免遭窃听,应用程序必须在发送信息前先对其加密,将它从明文转换为无法读懂的密文。接着,接收应用程序一接收到消息就对其解密,将它从密文转换回明文。其原理只不过是窃听者将不知道如何对消息解密。加密过程或解密过程一般被称作密码术,且依赖于数学算法。

加密算法通过在消息上执行一连串的数学操作从而对消息进行加密或解密,转换的是消息的外观而非其内容。算法被称作流密码(stream cipher)还是块密码(block cipher),取决于算法转换消息时是一次一个字节还是一次一个块(8 个字节)。加密算法是针对特定用例根据提供给算法的密钥创建的。密钥一般是 0 或 1 的一个随机序列;其大小区分了加密算法的能力。

加密算法通过以下两种方式之一使用密钥:

  • 对称算法要求消息的发送方和接收方使用同一个秘钥;这通常被称作秘钥密码术。
  • 非对称算法使用不同的密钥对消息进行加密或解密;其中一个秘钥必须是秘密的,而另一个密钥通常是公开的。在这种情况下,发送方可能会使用接收方的公钥对消息加密,但是只有接收方拥有用于对消息解密的秘钥。这种涉及到私钥和公钥对的方式也被称作公钥密码术。

对称算法的性能比非对称算法的性能快,但是在参与者之间安全地传递秘钥会引起分发问题。首先,您如何秘密传递密钥,其次,您如何将该方式扩展到多个发送方/接收方对。使用私钥和公钥对能缓解分发问题,因为接收方针对所有发送方发布了一个用来对信息进行加密的公钥,并且用一个私钥(秘钥)对接收到的所有信息解密。您不能对公钥进行逆向工程以获取私钥,而且只有接收方知道私钥。然而,这是以增加的性能开销为代价的。

篡改

篡改包括某人拦截一条消息并更改它。消息摘要解决了篡改问题,消息摘要是消息内容的定长数字表示。消息摘要(又称消息认证代码)是用散列函数计算的。这个过程只是单向的,意味着将函数反向并找到对应于摘要的消息是不可能的,因为该过程以这样一种方式实现,所以找到散列到同一摘要的两条不同消息在计算上难以实现。

一旦计算出了摘要,它就与消息一起被传送。接着,接收方对接收到的消息调用同一个散列函数,并将生成的摘要与接收到的摘要进行比较。如果这两个摘要是相同的,则消息在途中未被篡改。显然,要让这个过程生效,发送方和接收方必须在传送开始前就即将使用的散列函数达成一致。

模仿

当除实际指定的发送方之外的某个人发送消息时,就发生了模仿。要解决这个问题,您需要验证消息实际上是由发送方发送的,还需要认证正在与您交换信息的伙伴。

数字签名用于验证消息是否真正由发送方发送;数字签名结合了消息摘要和公钥密码术的使用。这个过程包括发送方生成消息摘要,然后用其私钥对摘要加密以创建数字签名。然后,接收方使用发送方的公钥对消息解密,确认消息确实是由发送方发送的。将这个摘要与接收方生成的摘要进行比较,进一步确认消息自从被签署就未被修改过。

但是,接收方怎么知道可以信任公钥呢?这个问题通常被称作中间人(man-in-the-middle)攻击,发生在未知的第三方拦截发送方的公钥并用它来交换自己的公钥的时候。于是,伪代理(rogue agent)模仿原发送方并签署被拦截的消息。因为接收方能够对发送的消息解密,所以接收方不知道它正在与一个伪用户进行交互。现在,我们要谈论的问题是,如何认证您正在与之交换信息的伙伴。

通过认证一个公钥属于一个命名的实体,数字证书解决了这个问题。数字证书一般是由名为认证中心(Certification Authority,CA)的可信的第三方签发的。CA 每生成一张数字证书,将需要收费,数字证书包括以下内容:

  • 所有者的公钥
  • 所有者的专有名称
  • 签发证书的 CA 的专有名称
  • 证书开始生效的日期
  • 证书过期日期
  • 版本号
  • 序列号

在签发证书前,认证中心对请求方进行适当的背景检查,以验证该请求方就是它自己所声称的请求方。CA 签发的所有证书都是由 CA 数字签署的,可以使用 CA 证书(它包含 CA 的公钥)对其进行验证。发送方和接收方之间的交换现在采取额外的一个验证步骤。发送方发送由 CA 签发的数字证书,而不仅仅是向接收方发送其公钥。接收方用 CA 的证书来验证发送方的证书,确定证书中所包含的公钥确实属于所有者。在一张数字证书的生命期中,正在签发的 CA 可能会决定该证书不再可信。这样的证书被发布到证书撤销列表(Certificate Revocation List)中,发送方和接收方都可以根据该列表检查接收到的证书。

安全套接字层

SSL 协议使用秘钥加密和公钥加密、数字签名以及数字证书的概念在各方之间建立一个安全连接,并且用这些概念使得在不安全网络上传输安全数据更容易。SSL 是由 Netscape(请参阅 SSL Protocol)设计的,它定义了下列参与者:

  • SSL 客户机:开始 SSL 连接的调用应用程序
  • SSL 服务器:响应应用程序

SSL 客户机和 SSL 服务器进行交互以建立一个安全连接。这个交互被称作 SSL 握手:

  1. SSL 客户机开始对话并发送诸如 SSL 版本之类的信息,同时还发送加密算法以及它所支持的散列函数。
  2. SSL 服务器用加密算法以及要使用的散列函数来表示响应。这是从客户机提供的列表中选择的。SSL 服务器还发送一个会话标识、一个随机字节字符串以及它的数字证书。服务器可以包括对客户机的数字证书的请求,这一点是可选的。
  3. 通过验证所提供的数字证书上的数字签名,SSL 客户机使用正进行签发的认证中心的证书来验证 SSL 服务器以及数字证书本身。可以根据证书撤销列表检查服务器的证书,这一点是可选的。
  4. 如果通过验证,SSL 客户机就发送秘钥,该秘钥将被用于对进一步的交换加密。秘钥使用从服务器的数字证书处获取的 SSL 服务器的公钥对自己进行加密。另外,如果服务器请求数字证书的话,客户机可能会发送它的数字证书。
  5. SSL 服务器使用它的私钥对秘钥解密并存储它。同样地,它使用正在进行签发的认证中心以及可能相关联的证书撤销列表来认证客户机,这是可选的。只有当上面的第 2 步中的服务器请求客户机的证书时,才会发生这一步骤。
  6. SSL 客户机发送一条用秘钥加密的消息,表示 SSL 握手中的客户机部分完成。
  7. SSL 服务器用一条同样用秘钥加密的消息作出响应,表示握手中的服务器部分完成。
  8. 现在就建立了一个安全连接,会话其余部分的通信是用秘钥加密的。

为了使 SSL 会话中所使用的加密算法和散列函数的规范更容易,这些算法被分组到各个密码套件(CipherSuite)中。密码套件定义了:

  • SSL 握手过程中的密钥交换和认证算法
  • 用于保护数据的加密算法
  • 用于生成消息摘要的散列函数

加密算法和散列函数被进一步分组到密码规范中。

WebSphere MQ 5.3 仅支持 RSA 密钥交换和认证算法。下表中列出了一些支持的密码规范的详细信息:

WebSphere MQ 5.3 支持的密码规范

密码规范名称散列算法加密算法加密位数
NULL_MD5MD50
NULL_SHASHA0
RC4_MD5_EXPORTMD5RC4(流密码)40
RC4_MD5_USMD5RC4128
RC4_SHA_USSHARC4128
RC2_MD5_EXPORTMD5RC2(块密码)40
DES_SHA_EXPORTSHADES(块密码)56
RC4_56_SHA_EXPORT1024SHARC456
DES_SHA_EXPORT1024SHADES56
TRIPLE_DES_SHA_US3SHA3DES(块密码)168

请注意:

  • RC2 是一个块密码算法。它按照块(8 字节长度)对数据加密,而且还支持长度为 40 位、64 位和 128 位的密钥。RC4 是一个流密码算法,它对数据的每个字节进行操作;和 RC2 一样,它支持长度为 40 位、64 位和 128 位的密钥。RC2 和 RC4 都是由 RSA Data Security Inc. 制定的。
  • DES,即美国国家数据加密标准(the United States Data Encryption Standard),是一个块密码算法,块长 8 字节,密钥长 56 位。Triple DES 是 DES 的一个变体,密钥长 168 位。
  • 就性能而言,从最快的到最慢的依次为:RC4、DES、RC2、TripleDES。
  • SHA 代表安全散列算法(Secure Hash Algorithm),MD5 代表消息摘要版本 5(Message Digest Version 5)。在 MD5 和 SHA-1 之间作选择是安全性和性能之间的权衡。与 MD5 算法的 128 位输出相比,SHA 算法更安全,它产生 160 位输出。但是,MD5 算法在计算消息摘要方面要更快一些。
  • SSL_RSA_WITH_RC4_SHA_US 是一个支持 MQ 的密码套件的示例。它规定了 RSA 密钥交换和认证算法的使用,还规定了 RC4_SHA_US 密码规范。

配置 WebSphere MQ SSL

要为 SSL 配置 WebSphere MQ 以及相关联的 JMS 客户机,您需要完成下列操作:

  1. 获取或生成 SSL 服务器的数字证书,SSL 客户机的数字证书是可选的
  2. 配置 SSL 服务器,在这个例子中是 MQ 队列管理器
  3. 配置 SSL 客户机,在这个例子中是 MQ JMS 应用程序

获取数字证书

要获取数字证书,您可以进行下面两个操作之一:

  • 向认证中心请求数字证书,或者
  • 使用特定于环境的工具生成一张自签署的证书

有了自签署的证书,您就可以充当自己的 CA 了。自签署的证书会对测试环境有帮助,因为您可以从本地生成这些证书,且无需向 CA 付费。不过,许多认证中心提供演示功能程序,让您免费生成演示(测试)证书。而且,在某些环境中,您可以请求 CA 为自签署的证书生成一张 CA 证书,这就确认并再签署了以前生成的证书。

在本文中,我们将使用一个认证中心的演示功能程序来为基于 Windows 2000 的队列管理器生成一张证书,然后我们将使用 Java 实用程序为 JMS 客户机应用程序生成一张自签署的证书。

证书存储在资源库中,这些资源库根据操作系统以及用来访问它们的工具而有所不同。在 Windows 平台上,证书存储在 Microsoft 证书库(Microsoft Certificate Store)中;您可以用 Internet Explorer 对它们进行查看和操作。在 Java 环境中,证书存储在密钥库(平面文件)中,您可以使用 keytool 对其进行操作, keytool 是一个实用程序,它是作为 JVM SSL 支持基础结构(今后将对它作更详细的描述)的一部分提供的。在 UNIX 上,您将使用 iKeyman 密钥管理工具处理数字证书。您必须熟悉正在讨论的操作环境所提供的或为该操作环境提供的数字证书基础结构支持。本文着重讨论了 Windows 环境和 Java 环境;不过,过程是相当普通的,主要的区别在于所使用的实际命令。

获取用于 WebSphere MQ 队列管理器的证书

Digitrust 是一个提供演示证书的认证中心。我们可以从该处获取 MQ 队列管理器的证书。

  1. 在您的 Internet Explorer 浏览器中启动 URL: http://www.digsigtrust.com/prod_serv/index.html
  2. 单击 Get a TrustID Demo Certificate(请参见图 1)。
    图 1. 获取一张 TrustID 演示证书
    www.digsigtrust.com 上的 Get a TrustID Demo Certificate 页面的抓屏
    www.digsigtrust.com 上的 Get a TrustID Demo Certificate 页面的抓屏
  3. 请填写身份确认表单。该证书是根据名字、组织和位置详细信息建立的。在图 2 中,名字 SSL QMGR 用于标识队列管理器证书。该证书被发送到提供的电子邮件地址。您提供的通行码(passphrase)用于检索证书。单击 Continue
    图 2. 服务器标识
    服务器身份确认表单的抓屏
    服务器身份确认表单的抓屏
  4. 检查一下信息,然后单击 Continue
  5. 选择 Browser作为用于存储证书的选项(请参见图 3)。单击 Continue
    图 3. 选择存储机制
    选择存储机制表单的抓屏
    选择存储机制表单的抓屏
  6. 单击证书协议(Certificate Agreement)上的 Accept
  7. 接受缺省值: 1024Microsoft Enhanced Cryptographic Provider v1.0。这些值用于生成您的公钥/私钥对(请参见图 4)。单击 Continue
    图 4. 生成密钥对
    生成密钥对表单的抓屏
    生成密钥对表单的抓屏
  8. 如果您从 Internet Explorer 接收到警告消息,它说明一个站点正在替您生成一张证书,那么请单击这些消息对话框上的 Yes
  9. 下一个窗格确认了正在生成证书。它还提示您下载 DST 根证书(DST Root Certificate);这一步不是必需的,因为 Windows 2000 预提供了来自不同认证中心的各种根证书(包括 DST 根证书)。
  10. 检查您的电子邮件以获得来自 Digitrust 的说明;它将包含一个 URL 以及激活代码。
  11. 使用 Internet Explorer 访问提供的 URL;提供您的通行码(请参见上面的第 3 步),然后单击 Retrieve
  12. 现在,Internet Explorer 将提示您添加一张证书。单击这个消息对话框上的 Yes
  13. 产生的状态屏幕确认证书已被添加。单击 Continue
  14. 要在 Internet Explorer 中查看证书,请选择 Tools => Internet Options。在产生的对话框上单击 Contents选项卡,然后单击 Certificates按钮。Certificates 对话框显示了 Microsoft 证书库中所有可用的证书。Personal 选项卡视图按字母顺序列出个人的证书,包括您刚生成的证书(请参见图 5)。
    图 5. Microsoft 证书库
    Microsoft 证书库在 Internet Explorer 中的抓屏
    Microsoft 证书库在 Internet Explorer 中的抓屏
  15. 单击 View按钮。这显示了与证书相关联的各种详细信息。Certification Path 选项卡视图显示了证书的证明链(请参见图 6)。证明链定义了批准认证中心的层次,并且提供了批准一张给定的个人证书所需的 CA 证书列表。在队列管理器的证书的例子中,证明链中有三张证书。JMS 客户机应用程序将需要对所有这三张 CA 证书进行访问,以成功地认证队列管理器的个人证书。
    图 6. 证书路径
    certification path 视图的抓屏
    certification path 视图的抓屏

为 JMS 客户机生成一张证书

JSSE(Java 安全套接字扩展(Java Secure Socket Extension))支持 Java 应用程序使用 SSL 安全地通信。它提供用于开发和部署基于 SSL 应用程序的 API 和实用程序。JSSE 与 J2SE 1.4 捆绑在一起;所支持的环境包括来自 IBM 和 Sun 的相同级别的 JRE。您可能还使用带有 IBM JSSE 1.0.3 包的 IBM JRE 1.3.1。但是,1.3.1 级别不支持扩展的功能(如证书撤销列表列表),因为它被定义为随 JRE 1.4 提供的 CertAPI 的一部分。因此,对于一个功能齐全的环境来说,J2SE 1.4 是必需的。

针对本文,我使用了 IBM JRE 1.3.1 和 JSSE 1.0.3。JSSE 1.0.3 包括用于将包添加到 JRE 的安装说明,在此我就不重复了。我还在 IBM JRE 1.4(随 JSSE 捆绑在一起提供)和 Sun JRE 1.4 上进行了测试。IBM JRE 1.4 不需要额外的包配置。如果您打算在 WebSphere Application Server 上运行 JMS 应用程序,请牢记,嵌入式 1.3.1 JVM 已经使用 JSSE 支持预配置过了,因此也不需要额外的配置。如果您对 JSSE 不熟悉,那么您可能打算粗略了解一下 相关信息部分中引用的 JSSE 教程以熟悉 JSSE。

在 Java 环境中,数字证书被存储在密钥库中,它们是以目录结构中的平面文件存储的。我们将为 JMS 应用程序创建一个密钥库;在这个密钥库中将生成一张自签署的证书。

在命令行中运行下面的命令:

keytool -genkey -keystore jmskeystore -storepass
        
        
changeit -keypass changeit -dname
"cn=JMSClient, ou=Test, o=IBM, c=US, st=MD"
-alias jmsclient -keyalg RSA -keysize 2048

该命令指定在一个位于当前目录下的密钥库中生成一张个人证书(公钥/私钥对)。密码与密钥库以及密钥相关联。指定了 X.500 专有名称,它标识了证书(这与向 CA 请求证书时填写标识信息是一样的)。该命令还包括证书的别名以及用于生成密钥对的算法规范和密钥大小。

现在您已经生成了一张自签署的证书,它包含在 jmskeystore 中,您可以在当前目录下找到该证书。

配置 WebSphere MQ 队列管理器

要将 WebSphere MQ 队列管理器配置成 SSL 服务器,您需要给它分配一张个人证书,并确保它能对任何 CA 或它可能需要的自签署证书进行访问。队列管理器维护一个证书库(密钥资源库),证书库被作为文件(扩展名 .sto )存储在队列管理器目录结构下。虽然您可以改变其位置,但是缺省值适合我们的目的。

  1. 在 MQExplorer 中,选择您的队列管理器(在我们的例子中是 SSLQMGR),单击右键查看属性。在 Properties 对话框中,单击 SSL选项卡(请参见图 7)。用该选项卡定义密钥资源库的位置,并对证书撤销列表服务器(请参阅 安全性概念部分)和硬件密码术支持(在一些平台上可以获得)进行配置。我们不打算使用这些额外的功能。单击 Manage SSL Certificates
    图 7. SSL 选项卡视图中提供的队列管理器属性
    SSL 选项卡视图中提供的队列管理器属性的抓屏
    SSL 选项卡视图中提供的队列管理器属性的抓屏
  2. 您需要添加队列管理器的个人证书,即前面生成的。单击 Add(请参见图 8)。产生的对话框(请参见图 9)提供了对机器上的 Microsoft 证书库的访问。找到队列管理器的证书( SSL QMGR),单击 Add。(请注意,对话框还让您从那些可能已经从其他系统中导出的文件中导入证书)。

    图 8. 管理 SSL 证书
    Manage SSL Certificates 对话框抓屏

    Manage SSL Certificates 对话框抓屏


    图 9. 添加队列管理器个人证书
    Add Certificate ? SSLQMGR 对话框的抓屏
    Add Certificate ? SSLQMGR 对话框的抓屏

  3. 您还需要添加来自于 JMS 客户机的公共证书;这是认证 JMS 客户机所必需的。在命令行中运行下面的命令:

    keytool -export -keystore jmskeystore -storepass changeit -alias jmsclient -file jmsclient.key

    该命令将用于个人证书(存储在 jmskeystore 下)的公钥导出到名为 jmsclient.key 的文件中。storepass 值应该与生成证书时所指定的值相匹配。
  4. 现在您可以导入用于 JMS 客户机的公共证书。在 Manage SSL Certificate 对话框中单击 Add,然后选择 Import from file单选按钮。
  5. 浏览并检索文件 jmsclient.key (将文件类型设置为所有文件)。password 域为空,单击 Add(图 10)。请注意,名为 JMSClient 的公共证书现在被添加到队列管理器的密钥资源库中了。

    现在,您已经添加了所有必需的证书。

    图 10. 从文件导入公共证书
    选择了 Import from a file 的 Add Certificate ? SSLQMGR 对话框的抓屏

    选择了 Import from a file 的 Add Certificate ? SSLQMGR 对话框的抓屏

  6. 在 Manage SSL Certificate 对话框中,选择添加的队列管理器证书 SSL QMGR,然后单击 Assign。在产生的对话框中,单击 Assign来确认您的选择。现在已经给队列管理器分配了一张用来认证它的证书,该队列管理器拥有对公共证书的访问权,这个公共证书是认证 JMS 客户机所必需的(请参见图 11)。
    图 11. 分配给队列管理器的证书
    显示分配给队列管理器的证书的抓屏
    显示分配给队列管理器的证书的抓屏
  7. 关闭所有打开的对话框。

现在,您将对通道进行配置,JMS 客户机将使用该通道与队列管理器进行 SSL 通信:

  1. 在 MQExplorer 中选择队列管理器 SSLQMGR。选择 Advanced文件夹,然后选择 Channels文件夹,单击右键。
  2. 在下拉菜单中选择 New => Server Connection Channel。在产生的对话框中,General 选项卡视图中提供了通道的名称(在这个例子中使用 SSL.SVRCONN )。切换到 SSL 选项卡视图,然后指定一个密码规范(在这个例子中使用 RC4_MD5_US )。请注意,缺省设置还规定了队列管理器应该认证 SSL 客户机(如果这不是所期望的,就不要选择复选框)(请参见图 12)。单击 OK

图 12. 指定新的服务器连接通道
在 Create Server Connection Channel SSL 选项卡视图中被指定的新的服务器连接通道的抓屏

在 Create Server Connection Channel SSL 选项卡视图中被指定的新的服务器连接通道的抓屏

现在,您已经配置了 JMS 客户机将用来与队列管理器进行通信的服务器连接通道。

对于上面的所有任务都有对应的命令行;当 GUI 不是必需的或不可用的时候(例如在非 Windows 平台上),运行这些命令。您可以在 相关信息部分中所列的 WebSphere MQ 用户指南中找到这些命令及属性;下表中列出了一些命令用于阐述目的:

与前面执行的操作相对应的命令行

操作命令
查看队列管理器密钥资源库位置

在 runmqsc(MQExplorer 对应的命令行)中运行:
DIS QMGR SSLKEYR

更改队列管理器密钥资源库位置在 runmqsc(MQExplorer 对应的命令行)中运行:
ALTER QMGR SSLKEYR(mynewfile)
向队列管理器密钥资源库添加公共证书在命令行提示符处运行:
amqmcert -a -m SSLQMGR -s jmsclient.key

amqmcert 是一个 MQ 实用程序,它使得从命令行进行证书管理更容易。

定义服务器连接通道在 runmqsc(MQExplorer 对应的命令行)中运行:
DEF CHL(SSL.SVRCONN) SSLCIPH(RC4_MD5_US)

配置 JMS 客户机

首先,要确保 JMS 客户机拥有对 CA 证书的访问权,这些 CA 证书是认证队列管理器所必需的。Java 运行时环境(Java Runtime Environment,JRE)为 CA 证书提供一个缺省密钥库,即 cacerts ,您可以在此处使用它。

  1. 在 Internet Explorer 浏览器中选择 Tools => Internet Options。在产生的对话框中单击 Contents选项卡,然后单击 Certificates按钮。
  2. 查看队列管理器的证书 SSL QMGR 并确认证书路径。选择 Certification Path选项卡。该选项卡视图包含 DEMO CA A6、DEMO Root CA X3 以及 DEMO RootCA X1。头两张证书位于 Intermediate Certification Authorities 选项卡视图中,第三张证书位于 Trusted Root Certification Authorities 选项卡视图中。
  3. 要获得所有这三个证书,请选择证书,然后单击 Export。Certificate Export Wizard 启动。单击 Next
  4. 接受缺省导出格式 DER encoded binary X.509 .CER。单击 Next
  5. 指定将要保存证书的路径和文件名(例如,对于 DEMO CAA6,指定 DEMOCAA6.cer 作为文件名)。单击 Next
  6. 单击 Finish导出证书。

您现在将 CA 证书存储在选择的目录下的文件中了。现在,您将使用 keytool 把 CA 证书导入到 CA 证书的缺省密钥库 cacerts 中。

  1. 在命令行中运行下面的命令:

    keytool -import -keystore JAVA_HOME\jre\lib\security\cacerts
    -storepass changeit -keypass changeit -aliasCAA6-file DEMOCAA6.cer
  2. 您将被询问是否可以信任该证书。输入 Y ,然后按 Enter。现在,这个证书就被添加了。

    如同您在上面的命令中所看到的, cacerts 位于您的 Java 运行时安装的 jre\lib\security 目录下。密钥库的缺省密码是 changeit ;如果需要的话,您可以更改密码。您可以通过为密钥库指定一个不同的名称来创建一个信任库,这是可选的。别名是一个标识字符串,它完全以证书的名称为基础;针对每个导入的文件,别名必须不同。
  3. 重复第 1 步和第 2 步,以导入其余的 CA 证书。

您已经成功地导入了所有必需的证书,现在就可以配置和运行 JMS 客户机应用程序了。

JMS 客户机应用程序不需要任何特别的 API 来利用 SSL,因为配置发生在 ConnectionFactory 中。针对该测试案例,我采用点到点(Point-to-Point)域,并编写了一个简单的应用程序来将消息放到队列中。虽然提供了源代码,但请注意,应用程序中没有任何特定于 SSL 的内容;它只不过是一个普通的 JMS 应用程序。

如同前面所提到的,SSL 配置是由应用程序检索的 ConnectionFactory 对象定义的。具体来说,针对这个例子的对象是 QueueConnectionFactory。要定义 QueueConnectionFactory,请使用 WebSphere MQ 5.3 提供的 jmsadmin 实用程序。

  1. 导航到包含 jmsadmin 工具的目录( <mq_home>\java\bin )。假设您已经对 JMSAdmin.config 进行了编辑,以配置一个名称空间来存储 JMS 受管的对象。现在,在命令行中运行 jmsadmin
  2. 通过运行下面的命令来定义 QueueConnectionFactory:

    DEF QCF(SSL) QMANAGER(SSLQMGR) TRANSPORT(CLIENT)HOSTNAME(localhost)
    PORT(1414) CHANNEL(SSL.SVRCONN) SSLCIPHERSUITE(SSL_RSA_WITH_RC4_128_MD5)

    该命令创建了一个 QueueConnectionFactory,它通过端口 1414 和通道 SSL.SVRCONN 使用机器本地主机上的客户机(基于网络的)传输来访问队列管理器 SSLQMGR。回想一下,这些值来自于队列管理器的配置。您仅需要设置属性 SSLCIPHERSUITE 的值,以便在连接到队列管理器时能够开始一个 SSL 连接。这就是 JMS 应用程序使用的 QueueConnectionFactory。
  3. 提供的样本 JMS 客户机应用程序要求定义一个 Queue 对象,该对象引用目标队列管理器上一个已经存在的队列。您可以通过运行下面的命令来定义 Queue 对象(同样,请确保您已经在队列管理器上创建了队列):

    DEF Q(Q1) QUEUE(Q1)

SSLCIPHERSUITE 值是由 JSSE 实现实现的有效的密码套件。WebSphere MQ 组件仅指定了一个密码规范,该密码规范只支持 SSL_RSA。因此,您需要为通道指定这样一个密码套件,它在功能上与 MQ 的 SSL 支持(SSL_RSA)以及为通道定义的密码规范等价,请注意,两种环境之间名称稍有差别。下表来自于 WebSphere MQ 5.3 Using Java 用户指南(附录 H),该指南详细介绍了 JSSE 密码套件以及相关的 WebSphere MQ 密码规范。

密码规范/密码套件关联

密码规范名称密码套件
NULL_MD5SSL_RSA_WITH_ NULL_MD5
NULL_SHASSL_RSA_WITH_ NULL_SHA
RC4_MD5_EXPORTSSL_RSA_EXPORT_WITH_ RC4_40_MD5
RC4_MD5_USSSL_RSA_WITH_ RC4_128_MD5
RC4_SHA_USSSL_RSA_WITH_ RC4_128_SHA
RC2_MD5_EXPORTSSL_RSA_EXPORT_WITH_ RC2_CBC_40_MD5
DES_SHA_EXPORTSSL_RSA_WITH_ DES_CBC_SHA
RC4_56_SHA_EXPORT1024SSL_RSA_EXPORT1024_WITH_ RC4_56_SHA
DES_SHA_EXPORT1024SSL_RSA_EXPORT1024_WITH_ DES_CBC_SHA
TRIPLE_DES_SHA_US3SSL_RSA_WITH_ 3DES_EDE_CBC_SHA

目前,WebSphere MQ 5.3 不让客户机向服务器传送密码套件列表。

运行测试案例

要运行一个普通的 JMS 应用程序来使用 SSL,您必须将两个关键的参数作为 Java 命令的一部分传递给 JVM。第一个参数提供将被使用的密钥库的位置,第二个参数提供访问密钥库所需的密码。因此,Java 命令将是这种格式:

Java -Djavax.net.ssl.keyStore=jmskeystore 
        
        
-Djavax.net.ssl.keyStorePassword=changeit <classname>

下载文件包含了一个样本 JMS 客户机应用程序。该应用程序需要指定了下列内容的其他参数:

  • 要从其中检索受管的对象的 JNDI 名称空间的类型
  • JNDI 名称空间的位置
  • QueueConnectionFactory 的名称
  • 以及定义了消息目的地的 Queue 对象的名称

因此,要运行该样本,您需要运行下面的 Java 命令:

Java -Djavax.net.ssl.keyStore=jmskeystore 
        
        
-Djavax.net.ssl.keyStorePassword=changeit
JMSSSLApp com.sun.jndi.fscontext.RefFSContextFactory
file:/C:/JNDINamespace SSL Q1

在这条命令中,JNDI 名称空间被标识为位于 C:\JNDINamespace 中的文件,QueueConnectionFactory 和 Queue 分别用 SSLQ1 来表示。

如果您已经正确地配置了所有内容,那么这个应用程序将成功地把一条消息放到队列中。要查看 SSL 发生的变化,您可以通过添加下面的命令开关,从而在 SSL 调试方式下运行 JVM:

  • 在 IBM 的 JVM 上添加: -Djavax.net.debug=true
  • 在 Sun 的 JVM 上添加: -Djavax.net.debug=ssl

因为交换冗长,所以我推荐您将输出输送到一个文件中。

如果您选择使用除缺省值( cacerts )之外的一个不同的密钥库来存储证书,那么您可以通过包括下面的命令开关来指定这个密钥库(被称作信任库):

-Djavax.net.ssl.trustStore=<truststore>

其中的 truststore 是您的 CA 密钥库的位置。

结束语

本文介绍了 SSL,并且描述了如何配置 JMS 客户机应用程序和 WebSphere MQ 队列管理器(JMS 提供者)之间的 SSL 连接。这包括:

  1. 获取 SSL 服务器(队列管理器)和 SSL 客户机(JMS 客户机)的数字证书。JMS 客户机的证书是必需的,只是因为我们想要服务器认证客户机。我们使用认证中心和独立的实用程序来生成证书。
  2. 配置 SSL 服务器(队列管理器)。我们将适当的证书植入队列管理器的密钥资源库,并给队列管理器分配了一张要在交换中使用的证书。
  3. 配置 SSL 客户机(JMS 客户机)。将必需的证书植入 Java 密钥库,并且为 SSL 配置 ConnectionFactory。

本文决不是没有遗漏的,但是遵循本文所列的步骤,您现在就可以轻松地配置和演示 SSL 安全的通信。


下载资源


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=55151
ArticleTitle=配置 JMS 客户机和 WebSphere MQ JMS 提供者之间的 SSL 连接
publish-date=02012003