Sun Java System Message Queue 3.7 UR1 管理指南

第 7 章 管理安全性

您可以配置用户系统信息库来验证用户、定义访问控制、配置用来加密客户端/代理通信的安全套接字层 (Secure Socket Layer, SSL) 连接服务,并设置代理启动时使用的密码文件。

本章包含以下各节:

用户验证

当用户尝试连接到代理时,代理将通过检查所提供的名称和密码来对用户进行验证。如果名称和密码与特定于代理的(每个代理均配置为需要查阅)用户系统信息库中的名称和密码相匹配,则允许该用户与代理建立连接。

您负责维护系统信息库中用户、用户组及用户密码的列表。各个代理实例可以使用不同的用户系统信息库。本节将说明如何创建、填充和管理系统信息库。

系统信息库可以是以下类型之一:

使用平面文件用户系统信息库

Message Queue 提供了一个平面文件用户系统信息库和一个命令行工具,即用户管理器实用程序 (imqusermgr),您可以使用它来填充和管理平面文件用户系统信息库。以下各节介绍平面文件用户系统信息库以及如何使用用户管理器实用程序来填充和管理该系统信息库。

创建用户系统信息库

平面文件用户系统信息库是特定于实例的。默认的用户系统信息库(名为 passwd)是为启动的每个代理实例自动创建的。此用户系统信息库所在的目录由与该系统信息库相关联的代理实例的名称标识(请参见附录 A, Message QueueTM 数据在特定平台上的位置):

   …/instances/instanceName/etc/passwd

创建的系统信息库具有两个条目。表 7–1 中的每一行显示一个条目。

表 7–1 用户系统信息库中的初始条目

用户名 

密码 

组 

状态 

admin

admin

admin

处于活动状态

guest

guest

anonymous

处于活动状态

这些初始条目使 Message Queue 代理安装后即可使用,不需要管理员的干预:

以下各节说明如何填充和管理平面文件用户系统信息库。

用户管理器实用程序

使用 Message Queue 用户管理器实用程序 (imqusermgr),您可以编辑或填充平面文件用户系统信息库。本节介绍了用户管理器实用程序。下文说明如何使用 imqusermgr 子命令完成特定任务。

有关 imqusermgr 命令的完整参考信息,请参见第 13 章,命令行参考

使用用户管理器之前,请谨记以下事项:


注 –

以下各节中的示例采用默认代理实例。


子命令

imqusermgr 命令包含子命令 adddeletelistupdate

命令选项

表 7–2 列出了 imqusermgr 命令的选项。

表 7–2 imqusermgr 选项

选项 

描述 

-a activeState

指定用户是否处于活动状态 (true/false)。true 表示处于活动状态。这是默认值。

-f

执行操作,无需用户确认。 

-h

显示用法帮助。不执行命令行上的其他选项。 

-i instanceName

指定命令要应用到的代理实例名。如果未指定,则采用默认实例名 imqbroker

-p passwd

指定用户密码。 

-g group

指定用户组。有效值包括 adminuseranonymous

-s

设置无提示模式。 

-u userName

指定用户名。 

-v

显示版本信息。不执行命令行上的其他选项。 

在代理实例的用户系统信息库中添加用户条目时,可以指定以下三个预定义组之一: adminuseranonymous。如果不指定任何组,则默认属于 user 组。应按如下方式指定组:

要更改用户所属的组,必须删除该用户的条目,然后为该用户添加另一个条目并为其指定新组。

您不能重命名或删除这些系统创建的组,也不能创建新组。但是,您可以指定访问规则,以定义该组的成员可以执行的操作。有关详细信息,请参见用户授权:访问控制属性文件

用户状态

向系统信息库中添加用户时,用户的默认状态是活动的。要使用户处于非活动状态,您必须使用 update 命令。例如,以下命令将使用户 JoeD 处于非活动状态:

imqusermgr update -u JoeD -a false

处于非活动状态的用户条目将保留在系统信息库中,但不能打开新连接。当某个用户处于非活动状态时,如果您试图添加具有相同名称的另一个用户,操作将失败。必须删除处于非活动状态的用户条目,或者更改新用户的名称,或者为新用户指定一个不同的名称。这样可以防止添加重复的用户名。

用户名和密码的格式

用户名和密码必须遵循以下原则:

填充和管理用户系统信息库

要在系统信息库中添加用户,可以使用 add 子命令。例如,以下命令向默认代理实例用户系统信息库添加用户名为 Katharine、密码为 sesame 的用户。

imqusermgr add -u Katharine -p sesame -g user

要从系统信息库中删除用户,可以使用 delete 子命令。例如,以下命令删除用户 Bob

imqusermgr delete -u Bob

要更改用户的密码或状态,可以使用 update 子命令。例如,以下命令将 Katharine 的密码更改为 aladdin

imqusermgr update -u Katharine -p aladdin

要列出一个或所有用户的相关信息,可以使用 list 命令。以下命令显示名为 isa 的用户的相关信息:

imqusermgr list -u isa

% imqusermgr list -u isa

User repository for broker instance: imqbroker
----------------------------------
User Name    Group    Active State
----------------------------------
isa          admin    true

以下命令列出所有用户的相关信息:

imqusermgr list

% imqusermgr list

User repository for broker instance: imqbroker
--------------------------------------
User Name    Group        Active State
--------------------------------------
admin        admin        true
guest        anonymous    true
isa          admin        true
testuser1    user         true
testuser2    user         true
testuser3    user         true
testuser4    user         false
testuser5    user         false

更改默认的管理员密码

为安全起见,应该将 admin 的默认密码更改为只有您自己知道的密码。以下命令将 mybroker 代理实例的默认管理员密码 admin 更改为 grandpoobah

imqusermgr update mybroker -u admin -p grandpoobah

要快速确认此更改是否已生效,可以在代理实例运行时运行任何命令行工具。例如,以下命令将提示您输入密码:

imqcmd list svc mybroker -u admin

输入新密码 (grandpoobah) 将会被接受;而输入旧密码则会失败。

更改密码后,使用任何 Message Queue 管理工具(包含管理控制台)时都应该提供新密码。

使用 LDAP 服务器管理用户系统信息库

要使用 LDAP 服务器来管理用户系统信息库,请执行以下任务:

编辑实例配置文件

要让代理使用目录服务器,请设置代理实例配置文件 config.properties 中某些属性的值。设置这些属性后,每当用户试图连接到代理实例或执行消息传送操作时,代理实例都会在 LDAP 服务器中查询有关用户和组的信息。

实例配置文件位于代理实例目录下的某个目录中。路径的格式如下:

/instances/instanceName

/props/config.properties

有关实例目录在特定操作系统中的位置的信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置

Procedure编辑配置文件以使用 LDAP 服务器

  1. 通过设置以下属性,指定您使用的是 LDAP 用户系统信息库:


    imq.authentication.basic.user_repository=ldap
  2. 设置 imq.authentication.type 属性,确定密码是以 Base64 (basic) 还是 MD5 (digest) 编码的形式从客户端传递给代理。使用 LDAP 目录服务器管理用户系统信息库时,必须将验证类型设置为 basic。例如,


    imq.authentication.type=basic
  3. 还必须设置控制 LDAP 访问的代理属性。这些属性存储在代理的实例配置文件中。安全服务对这些属性进行了讨论,安全属性对这些属性进行了总结。

    Message Queue 使用 JNDI API 与 LDAP 目录服务器进行通信。有关这些属性的语法及其所引用的术语的详细信息,请查阅 JNDI 文档。Message Queue 使用 Sun JNDI LDAP 提供者并使用简单验证。

    Message Queue 支持 LDAP 验证故障转移:可以指定要尝试进行验证的 LDAP 目录服务器列表(请参见 imq.user.repos.ldap.server 属性的参考信息)。

    有关说明如何设置 LDAP 用户系统信息库相关属性的示例,请参见代理的 config.properties 文件。

  4. 必要时,还需要编辑访问控制属性文件中的用户/组和规则。有关使用访问控制属性文件的详细信息,请参见用户授权:访问控制属性文件

  5. 如果您希望代理在连接验证和组搜索时通过 SSL 与 LDAP 目录服务器进行通信,您需要在 LDAP 服务器中激活 SSL,然后在代理配置文件中设置以下属性:

    • 指定 LDAP 服务器进行 SSL 通信时所使用的端口。例如:


      imq.user_repository.ldap.server=myhost:7878
    • 将代理属性 imq.user_repository.ldap.ssl.enabled 设置为 true

      使用多个 LDAP 目录服务器时,可以使用 ldap:// 指定每个额外的目录服务器。例如:

      imq.user_repository.ldap.server = myHost:7878 ldap:// otherHost:7878

      用空格分隔每个额外的目录服务器。对于其他与 LDAP 相关的属性,列表中的所有目录服务器必须使用相同的值。

为管理员设置访问控制

要创建管理用户,请使用访问控制属性文件指定能够创建 ADMIN 连接的用户和组。必须在 LDAP 目录中预定义这些用户和组。

能够创建 ADMIN 连接的任何用户或组都可以执行管理命令。

Procedure设置管理用户

  1. 将代理属性 imq.accesscontrol.enabled 设置为 true(默认值),以允许使用访问控制文件。

    imq.accesscontrol.enabled 属性允许使用访问控制文件。

  2. 打开访问控制文件 accesscontrol.properties附录 A, Message QueueTM 数据在特定平台上的位置 中列出了该文件的位置。

    该文件包含一个如下所示的条目:

    service connection access control##################################connection.NORMAL.allow.user=*connection.ADMIN.allow.group=admin

    列出的条目是示例。请注意,admin 组存在于基于文件的用户系统信息库中,而非默认存在于 LDAP 目录中。您必须将在 LDAP 目录中定义的组的名称替换为要为其授予 Message Queue 管理员权限的组的名称。

  3. 要为用户授予 Message Queue 管理员权限,请按如下所示输入用户名:

    connection.ADMIN.allow.user= userName[[,userName2] ]

  4. 要为组授予 Message Queue 管理员权限,请按如下所示输入组名称:

    connection.ADMIN.allow.group= groupName[[,groupName2] ]

用户授权:访问控制属性文件

访问控制属性文件(ACL 文件)包含一些规则,用来指定用户和用户组可以执行的操作。您可以编辑 ACL 文件,将操作限定给某些用户和组。各个代理实例可以使用不同的 ACL 文件。

无论用户信息是放在平面文件用户系统信息库中还是放在 LDAP 用户系统信息库中,都会使用 ACL 文件。当客户端应用程序执行以下操作之一时,代理将会检查其 ACL 文件:

代理将检查 ACL 文件,以确定是授权生成请求的用户还是用户所属的组来执行该操作。

如果对 ACL 文件进行编辑,新的设置将在下一次代理检查该文件以验证授权时生效。编辑完文件后,不需要重新启动代理。

创建访问控制属性文件

ACL 文件是特定于实例的。每次启动代理实例时,都会在该实例目录中创建一个名为 accesscontrol.properties 的默认文件。该文件的路径为如下格式(请参见附录 A, Message QueueTM 数据在特定平台上的位置):

…/instances/brokerInstanceName/etc/accesscontrol.properties

ACL 文件的格式与 Java 属性文件类似。首先定义文件的版本,然后指定访问控制规则,规则分为三部分:

version 属性定义 ACL 属性文件的版本,不能更改此条目。

version=JMQFileAccessControlModel/100

下面说明访问规则的基本语法并介绍如何计算权限,然后介绍指定访问控制的 ACL 文件的三个组成部分。

访问规则语法

ACL 属性文件中,访问控制用于定义特定用户或组对受保护的资源(如物理目的地和连接服务)具有哪些访问权限。访问控制由一个规则或一组规则组成,每个规则都由一个 Java 属性表示:

这些规则的基本语法如下:

resourceType.resourceVariant

.operation.access.
principalType=principals

表 7–3 介绍了语法规则的元素。

表 7–3 访问规则的语法元素

元素 

描述 

resourceType

以下选项之一:connectionqueuetopic

resourceVariant

resourceType 指定的类型的一个实例。例如,myQueue。通配符 (*) 可用于表示所有连接服务类型或所有物理目的地。

operation

值取决于所设置的访问规则的类型。 

access

以下选项之一:allowdeny

principalType

以下选项之一:usergroup。有关详细信息,请参见

principals

可能具有规则左侧指定的访问权限的人。如果 principalTypeuser,则可能是单个用户或以逗号分隔的用户列表;如果 principalTypegroup,则可能是单个组或以逗号分隔的组列表。通配符 (*) 可用于表示所有用户或所有组。

下面是一些访问规则示例:


注 –

要指定非 ASCII 的用户、组或目的地名称,请使用 Unicode 转义符 (\\uXXXX) 表示法。如果在您编辑并保存的 ACL 文件中,这些名称采用了非 ASCII 编码,则可以通过 Java native2ascii 工具将此文件转换为 ASCII。有关更多详细信息,请参见

http://java.sun.com/j2se/1.4/docs/guide/intl/faq.html

权限的计算方式

当文件中存在多个访问规则时,将按如下方式计算权限:

用于连接服务的访问控制

ACL 属性文件中的连接访问控制部分包含代理连接服务的访问控制规则。连接访问控制规则的语法如下:

connection.resourceVariant.
access.principalType=
principals

resourceVariant 定义了两个值:NORMALADMIN。这些预定义的值是您唯一能够授予访问权限的连接服务类型。

默认的 ACL 属性文件授予所有用户访问 NORMAL 连接服务的权限,并授予 admin 组中的用户访问 ADMIN 连接服务的权限:

connection.NORMAL.allow.user=*
connection.ADMIN.allow.group=admin

如果您使用的是基于文件的用户系统信息库,则默认组 admin 由用户管理器实用程序创建。如果您使用的是 LDAP 用户系统信息库,则可以通过执行以下操作之一来使用默认 ACL 属性文件:

您可以对连接访问权限加以限定。例如,以下规则拒绝 Bob 访问 NORMAL,但允许其他人访问:

connection.NORMAL.deny.user=Bob
connection.NORMAL.allow.user=*

可以使用星号 (*) 指定所有通过验证的用户或组。

使用 ACL 属性文件来授权访问 ADMIN 连接的方式与使用基于文件的用户系统信息库和 LDAP 用户系统信息库不同,如下所示:

对物理目的地的访问控制

访问控制属性文件的目的地访问控制部分包含基于物理目的地的访问控制规则。这些规则决定谁(用户/组)可以在哪里(物理目的地)执行什么(操作)。这些规则控制的访问类型包括向队列发送消息、向主题发布消息、从队列接收消息、订阅主题以及浏览队列中的消息。

默认情况下,任何用户或组都可以对任何物理目的地进行任意类型的访问。您可以添加更多特定的目的地访问规则或编辑默认的规则。本节的余下部分介绍物理目的地访问规则的语法,您必须理解这些语法才能编写自己的规则。

目的地规则的语法如下:

resourceType.resourceVariant.operation.access.principalType=principals

表 7–4 介绍了这些元素:

表 7–4 物理目的地访问控制规则的元素

组件 

描述 

resourceType

可以是 queuetopic

resourceVariant

某个物理目的地名或所有物理目的地 (*),星号表示所有队列或所有主题。 

operation

可以是 produceconsume browse

access

可以是 allowdeny

principalType

可以是 usergroup

可以将访问权限授予一个或多个用户和/或组。

以下示例说明了不同类型的物理目的地访问控制规则:

对自动创建的物理目的地的访问控制

ACL 属性文件最后一部分所包括的访问规则指定代理将为哪些用户和组自动创建物理目的地。

当用户在尚不存在的物理目的地上创建生成方或使用方时,如果已启用代理的自动创建属性,则代理将会创建该目的地。

默认情况下,任何用户或组都有权让代理为其自动创建一个物理目的地。此权限由以下规则指定:

queue.create.allow.user=*
topic.create.allow.user=*

您可以编辑 ACL 文件以限制此类访问权限。

物理目的地自动创建访问规则的一般语法如下:

resourceType.create.access.principalType=principals

其中 resourceTypequeuetopic

例如,以下规则允许代理为除 Snoopy 之外的每个用户自动创建 topic 目的地。

topic.create.allow.user=*
topic.create.deny.user=Snoopy

请注意,物理目的地自动创建规则的效果必须与物理目的地访问规则的效果一致。例如,如果您 1) 更改目的地访问规则,禁止任何用户向目的地发送消息;但是 2) 启用了目的地的自动创建,那么如果目的地不存在,代理创建一个物理目的地,但不会向该目的地发送任何消息。

消息加密

本节将说明如何设置基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务,此连接服务在客户端与代理之间发送加密的消息。Message Queue 支持以下基于 SSL 的连接服务:

本节后面部分将介绍如何使用 ssljms ssladmincluster 连接服务通过 TCP/IP 建立安全连接。有关使用 httpsjms 服务通过 HTTP 建立安全连接的信息,请参见附录 C,HTTP/HTTPS 支持

使用自签名证书

要使用通过 TCP/IP 建立的基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成公钥/私钥对。此实用程序将公钥嵌入自签名证书,此证书将传递给请求连接到代理的任何客户端,客户端需要使用该证书建立加密连接。本节介绍如何使用这样的自签名证书来设置基于 SSL 的服务。

如果需要更严密的验证,您可以使用由证书颁发机构验证的签名证书。若要使用签名证书,则除了使用自签名证书需要的步骤外,还需要其他一些步骤:必须先执行本节中介绍的步骤,然后再执行使用签名证书中的其他步骤。

Message Queue 对带有自签名证书的 SSL 支持用于保护所传输数据的安全性,并假定客户端正在与已知且可信任的服务器进行通信。以下过程说明了设置基于 SSL 的连接服务以使用自签名证书所需的步骤。下面各节更详细地介绍了每个步骤。

Procedure使用自签名证书设置基于 SSL 的连接服务

  1. 生成自签名证书。

  2. 在代理中启用 ssljmsssladmincluster 连接服务。

  3. 启动代理。

  4. 配置并运行客户端。

    此步骤仅适用于 ssljms 连接服务,不适用于 ssladmin cluster

生成自签名证书

运行密钥工具实用程序 (imqkeytool) 为代理生成自签名证书。(在 UNIX® 系统上,您可能需要以超级用户 (root) 身份运行该实用程序,才能获取创建密钥库的权限。)可以对 ssljmsssladmincluster 连接服务使用相同的证书。

在命令提示符下输入以下内容:

imqkeytool -broker

密钥工具实用程序会提示您输入密钥库密码:

   Generating keystore for the broker ...
   Enter keystore password:

然后,实用程序将提示您输入标识此证书所属的代理的信息。您提供的信息将构成 X.500 标识名。表 7–5 显示了一些提示和为每个提示提供的值。值区分大小写,并且可以包含空格。

表 7–5 自签名证书所需的标识名信息

提示 

X.500 属性 

描述 

示例 

您的姓名是什么?

commonName (CN)

运行代理的服务器的全限定名称 

mqserver.sun.com

您所在部门的名称是什么?

organizationalUnit (OU)

部门或分部的名称 

purchasing

您的工作单位的名称是什么?

organizationName (ON)

大型工作单位的名称,如公司或政府机构 

My Company, Inc.

您所在城市或地区的名称是什么?

localityName (L)

城市或地区的名称 

San Francisco

您所在州或省的名称是什么?

stateName (ST)

州或省的全称,不要使用缩写 

California

此单位的两字母国家/地区代码是什么?

country (C)

标准两字母国家/地区代码 

US

输入信息后,密钥工具实用程序将显示这些信息以便于您确认。例如:

   Is CN=mqserver.sun.com, OU=purchasing, ON=My Company, Inc.,
   L=San Francisco, ST=California, C=US correct?

要接受当前值并继续,请输入 yes;要重新输入值,请接受默认值或输入 no。确认后,实用程序将生成密钥对而暂停其他操作。

接下来,实用程序要求您输入密码以锁定密钥对(密钥密码)。按 Return 键响应此提示,以使用同一密码作为密钥密码和密钥库密码。


注 –

请记住您指定的密码。启动代理时必须提供此密码,代理才能打开密钥库。可以将密钥库密码存储到密码文件中(请参见密码文件)。


密钥工具实用程序生成一个自签名证书,并将其放入 Message Queue 的密钥库。密钥库所在的目录因操作系统而异,附录 A, Message QueueTM 数据在特定平台上的位置 中所示。

以下是适用于基于 SSL 连接服务的 Message Queue 密钥库的可配置属性:

有时候您可能需要重新生成密钥对才能解决某些问题:例如,如果您在启动代理时忘记了密钥库密码或基于 SSL 的服务初始化失败,并收到了异常:

java.security.UnrecoverableKeyException:Cannot recover key

(出现异常的原因可能是因为您提供的密钥密码与您生成自签名证书时的密钥库密码不同。)

Procedure重新生成密钥对

  1. 删除代理的密钥库。有关密钥库的位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置

  2. 再次运行 imqkeytool 生成新密钥对,如上所述。

启用基于 SSL 的连接服务

要在代理中启用基于 SSL 的连接服务,您需要将 ssljms(或 ssladmin)添加到 imq.service.activelist 属性。

Procedure在代理中启用基于 SSL 的服务

  1. 打开代理的实例配置文件。

    实例配置文件位于一个由代理实例名称 (instanceName) 标识的目录中,而该实例名称与此配置文件是相关联的(请参见附录 A, Message QueueTM 数据在特定平台上的位置):

       .../instances/instanceName/props/config.properties
    
  2. imq.service. activelist 属性添加一个条目(如果此条目尚不存在),并将需要的基于 SSL 的服务包括在列表中。

    默认情况下,此属性包括 jmsadmin 连接服务。添加基于 SSL 的服务或希望激活的服务(ssljms 和/或 ssladmin):

    imq.service.activelist=jms,admin,ssljms,ssladmin
    

    注 –

    基于 SSL 的 cluster 连接服务是使用 imq.cluster.transport 属性启用的,而不是使用 imq.service. activelist 属性启用的;请参见连接代理


  3. 保存并关闭实例配置文件。

启动代理

启动代理并提供密钥库密码。您可以通过以下两种方式之一提供密码:


注 –

启用带有 SSL 的代理或客户端时,您可能会注意到它在几秒钟内使用了大量的 CPU 资源。这是因为 Message Queue 使用 JSSE(Java Secure Socket Extension,Java 安全套接扩展)方法 java.security.SecureRandom 来生成随机数,此方法需要大量时间生成初始随机数初始化向量。生成初始化向量后,CPU 的使用率将降到正常水平。


配置并运行基于 SSL 的客户端

配置客户端以使用基于 SSL 的连接服务的过程各有不同,具体情况取决于客户端是应用程序客户端(使用 ssljms 连接服务)还是 imqcmd 之类的 Message Queue 管理客户端(使用 ssladmin 连接服务。)

应用程序客户端

对于应用程序客户端,您必须确保客户端在其 CLASSPATH 变量中指定了 .jar 文件:

如果您使用的是 Java 2 Software Development Kit (J2SDK) 1.4 之前的版本,您还必须包括 Java 安全套接扩展 (Java Secure Socket Extension, JSSE) 和 Java 命名和目录接口 (Java Naming and Directory Interface, JNDI) .jar 文件:

(如果使用的是 J2SDK 1.4 或之后的版本,则不需要包括这些文件,因为这些版本有内置的 JSSE 和 JNDI 支持。)

正确指定了 CLASSPATH 文件之后,启动客户端并连接到代理的 ssljms 连接服务的方法之一是输入如下命令:

java -DimqConnectionType=TLS clientAppName

这将通知连接使用基于 SSL 的连接服务。

管理客户端

对于管理客户端,可以通过在调用 imqcmd 命令时包含 -secure 选项来建立一个安全的连接:例如,

imqcmd list svc -b hostName:portNumber -u adminName -secure

其中 adminName 是 Message Queue 用户系统信息库中的有效条目。该命令将提示您输入密码。(如果使用的是平面文件系统信息库,请参见更改默认的管理员密码)。

列出连接服务是验证 ssladmin 服务是否正在运行的一种方法,也可以验证是否能成功建立安全的管理连接,如以下输出所示:


Listing all the services on the broker specified by:

Host                 Primary Port
localhost            7676

Service Name     Port Number       Service State
admin            33984 (dynamic)   RUNNING
httpjms          -                 UNKNOWN
httpsjms         -                 UNKNOWN
jms              33983 (dynamic)   RUNNING
ssladmin         35988 (dynamic)   RUNNING
ssljms           dynamic           UNKNOWN

Successfully listed services.

使用签名证书

签名证书可以提供比自签名证书更严密的服务器验证。您只能在客户端与代理之间实现签名证书,而不能在群集中的多个代理之间实现签名证书。除了上面介绍的配置自签名证书的步骤外,使用签名证书还需要其他一些步骤(见下文)。以下各节更详细地介绍了这些步骤。

Procedure使用签名证书

  1. 在密钥库中安装证书。

  2. 配置 Message Queue 客户端,使其在与代理建立基于 SSL 的连接时请求签名证书。

获取和安装签名证书

以下过程说明如何获取和安装签名证书。

Procedure获取签名证书

  1. 使用 J2SE keytool 命令为上一节中生成的自签名证书生成一个证书签名请求 (Certificate Signing Request, CSR)。

    有关 keytool 命令的信息,可以参考

    http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html

    下面是一个示例:


    keytool -certreq -keyalg RSA -alias imq -file certreq.csr
            -keystore /etc/imq/keystore -storepass myStorePassword

    这将生成一个 CSR,它将证书封装到指定的文件中(本例中是文件 certreq.csr )。

  2. 使用 CSR 生成或请求签名证书。

    您可以通过以下两种方法之一完成:

    • 由众所周知的证书颁发机构 (Certificate Authority, CA) 签署证书,如 Thawte 或 Verisign。有关如何操作的详细信息,请参见 CA 的文档。

    • 使用 SSL 签名软件包亲自对证书进行签名。

      最终的签名证书是一个 ASCII 字符序列。如果从 CA 收到签名证书,它可能是电子邮件附件或消息文本。

  3. 将签名证书保存到文件中。

    以下说明使用示例名 broker.cer 来表示代理证书。

Procedure安装签名证书

  1. 检查 J2SE 是否默认支持您的证书颁发机构。

    此命令列出系统密钥库中的根 CA:

    keytool -v -list -keystore $JAVA_HOME/lib/security/cacerts
    

    如果您的 CA 已列出,请跳过下一步。

  2. 如果 J2SE 不支持您的证书颁发机构,请将 CA 的根证书导入到 Message Queue 密钥库中。

    下面是一个示例:

    keytool -import -alias ca -file ca.cer -noprompt -trustcacerts
            -keystore /etc/imq/keystore -storepass myStorePassword
    

    其中 ca.cer 是包含从 CA 获取的根证书的文件。

    如果您使用的是 CA 测试证书,则可能需要导入测试 CA 根证书。您的 CA 应提供有关如何获取副本的说明。

  3. 将签名证书导入到密钥库中以替换原来的自签名证书。

    下面是一个示例:

    keytool -import -alias imq -file broker.cer -noprompt -trustcacerts
            -keystore /etc/imq/keystore -storepass myStorePassword
    

    其中 broker.cer 是包含从 CA 收到的签名证书的文件。

    Message Queue 密钥库现在包含一个用于 SSL 连接的签名证书。

配置 Message Queue 客户端运行时环境以请求签名证书

现在,您必须将 Message Queue 客户端运行时环境配置为请求签名证书,并确保客户端信任对该证书进行签名的证书颁发机构。

Procedure要配置客户端运行时环境以请求签名证书

  1. 将连接工厂的 imqSSLIsHostTrusted 属性设置为 false

    默认情况下,客户端用来建立代理连接的连接工厂对象的 imqSSLIsHostTrusted 属性被设置为 true,表示客户端运行时环境将接受提供给它的任何证书。您必须将此值更改为 false,这样客户端运行时环境将尝试验证所有提供给它的证书。 如果证书签署人不在客户端的信任库中,验证将会失败。

  2. 验证签名机构是否已在客户端的信任库中注册。

    要测试客户端是否会接受由您的证书颁发机构签名的证书,请尝试建立 SSL 连接,如上文配置并运行基于 SSL 的客户端中所述。如果 CA 在客户端的信任库中,连接将会成功,您可以跳过下一步。如果连接由于证书验证错误而失败,请执行下一步。

  3. 在客户端的信任库中安装签名 CA 的根证书。

    默认情况下,客户端搜索密钥库文件 cacertsjssecacerts,因此,如果您在两个文件中的任何一个中安装了证书,则无需进行进一步的配置。以下示例将文件 testrootca.cer 中的 Verisign 证书颁发机构的测试根证书安装到默认系统证书文件 cacerts 中。该示例假定 J2SE 安装在 $JAVA_HOME/usr/j2se 目录中:

    keytool -import -keystore /usr/j2se/jre/lib/security/cacerts
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    还可以(并建议)将根证书安装到可选系统证书文件 jssecacerts 中:

    keytool -import -keystore /usr/j2se/jre/lib/security/jssecacerts
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    第三种可能是将根证书安装到其他密钥库文件中,并配置客户端以使用该文件作为其信任库。以下示例将根证书安装到文件 /home/smith/.keystore 中:

    keytool -import -keystore /home/smith/.keystore
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    默认情况下,客户端不搜索此密钥库,因此您必须明确地向客户端提供其位置,将其用作信任库。您可以在客户端运行后,通过设置 Java 系统属性 javax.net.ssl.trustStore 执行此操作:

    javax.net.ssl.trustStore=/home/smith/.keystore
    

密码文件

多种类型的命令都需要密码。在表 7–6 中,第一列列出了需要密码的命令,第二列列出了需要密码的原因。

表 7–6 使用密码的命令

命令 

用途 

密码的用途 

imqbrokerd

启动代理 

访问基于 JDBC 的持久性数据存储库、SSL 证书密钥库或 LDAP 用户系统信息库 

imqcmd

管理代理 

验证被授权使用此命令的管理用户 

imqdbmgr

管理基于 JDBC 的数据存储库 

访问数据存储库 

可以在密码文件中指定这些密码,并使用 passfile 选项指定该文件的名称。下面是 -passfile 选项的格式:

imqbrokerd -passfile myPassfile

注 –

在以前的版本中,您可以使用 -p-password -dbpassword-ldappassword 选项在命令行指定密码。不赞成使用这些选项,在今后的版本中会将它们删除。在当前的发行版中,其中某个选项在命令行中的值将取代密码文件中相关联的值。


安全性问题

以交互方式指定密码以响应提示是最安全的密码指定方法,除非他人也可以看到您的监视器。您也可以在命令行中指定密码文件。但是,以非交互方式使用命令时,必须使用密码文件。

密码文件是未加密的,因此,您必须设置其权限以防止未经授权的访问。应设置权限以限制可以查看该文件的用户,但为启动代理的用户提供读取权限。

密码文件内容

密码文件是包含一组属性和值的简单文本文件。每个值都是由某一命令使用的密码。

密码文件可包含表 7–7 中所示的密码:

表 7–7 密码文件中的密码

密码 

受影响的命令 

描述 

imq.imqcmd.password 

+-imqcmd 

imqcmd 命令行指定管理员密码。需要对每个命令验证此密码。


imq.keystore.password

imqbrokerd 

为基于 SSL 的服务指定密钥库密码。 


imq.persist.jdbc.password

imqbrokerd
imdbmgr

指定用于打开数据库连接的密码,如有必要。 


imq.user_repository.ldap.password

imqbrokerd

指定与代理的标识名(用于绑定到已配置的 LDAP 用户系统信息库)相关联的密码。 

Message Queue 产品提供了样例密码文件。有关样例文件位置的信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置

通过防火墙连接

当客户端应用程序与代理被防火墙隔开时,需要使用一些特殊的方法来建立连接。一种方法是使用 httpjmshttpsjms 连接服务(可以使用“隧道”通过防火墙);有关详细信息,请参见附录 C,HTTP/HTTPS 支持。但是 HTTP 连接比其他连接服务慢,一种更快的选择是绕过 Message Queue 端口映射器,并明确地为所需的连接服务指定静态端口地址,然后在防火墙中打开该特定端口。可以使用该方法以及 jmsssljms 连接服务(在特殊情况下,使用 adminssladmin 连接服务)通过防火墙建立连接。

表 7–8 静态端口地址的代理配置属性

连接服务 

配置属性 

jms

imq.jms.tcp.port

ssljms

imq.ssljms.tls.port

admin

imq.admin.tcp.port

ssladmin

imq.ssladmin.tls.port

Procedure启用通过防火墙的代理连接

  1. 为要使用的连接服务指定静态端口地址。

    要绕过端口映射器直接为某个连接服务指定静态端口号,请设置代理配置属性 imq.serviceName. protocolType.port,其中 serviceName 是连接服务的名称,而 protocolType 是其协议类型(请参见表 7–8)。与所有代理配置属性一样,您可以在代理的实例配置文件中指定该属性,也可以在启动代理时通过命令行指定。例如,要为 jms 连接服务指定端口号 10234,可以在配置文件中包括以下命令行:

       imq.jms.tcp.port=10234
    

    也可以在启动代理时使用以下命令:

       
    imqbrokerd  -name myBroker  -Dimq.jms.tcp.port=10234
    
  2. 配置防火墙以允许连接到为连接服务指定的端口号。

    您还必须允许连接能通过防火墙连接到 Message Queue 的端口映射器端口(通常是 7676,除非将端口映射器重新指定到其他一些端口)。例如,在上面的示例中,需要在防火墙中打开端口 102347676

审计日志记录

Message Queue 仅在 Enterprise Edition 中支持审计日志记录。启用审计日志记录后,Message Queue 将为下列类型的事件生成记录:

要将审计记录记录到 Message Queue 代理日志文件中,请将 imq.audit.enabled 代理属性设置为 true 。日志中的所有审计记录都包含关键字 AUDIT