您可以配置用户系统信息库来验证用户、定义访问控制、配置用来加密客户端/代理通信的安全套接字层 (Secure Socket Layer, SSL) 连接服务,并设置代理启动时使用的密码文件。
本章包含以下各节:
当用户尝试连接到代理时,代理将通过检查所提供的名称和密码来对用户进行验证。如果名称和密码与特定于代理的(每个代理均配置为需要查阅)用户系统信息库中的名称和密码相匹配,则允许该用户与代理建立连接。
您负责维护系统信息库中用户、用户组及用户密码的列表。各个代理实例可以使用不同的用户系统信息库。本节将说明如何创建、填充和管理系统信息库。
系统信息库可以是以下类型之一:
Message QueueTM 附带的平面文件系统信息库
此类型的用户系统信息库非常易于使用。您可以使用用户管理器实用程序 (imqusermgr) 来填充和管理系统信息库。要启用验证,您需要用每个用户的名称和密码以及用户组的名称填充用户系统信息库。
有关设置和管理用户系统信息库的详细信息,请参见使用平面文件用户系统信息库
LDAP 服务器
这可以是现有的或新的 LDAP 目录服务器,这种服务器使用 LDAP v2 或 v3 协议。它并不像平面文件系统信息库那样易于使用,但它的可伸缩性更好,因此更适用于生产环境。
如果您目前使用的是 LDAP 用户系统信息库,请使用 LDAP 供应商提供的工具来填充和管理用户系统信息库。有关详细信息,请参见使用 LDAP 服务器管理用户系统信息库。
Message Queue 提供了一个平面文件用户系统信息库和一个命令行工具,即用户管理器实用程序 (imqusermgr),您可以使用它来填充和管理平面文件用户系统信息库。以下各节介绍平面文件用户系统信息库以及如何使用用户管理器实用程序来填充和管理该系统信息库。
平面文件用户系统信息库是特定于实例的。默认的用户系统信息库(名为 passwd)是为启动的每个代理实例自动创建的。此用户系统信息库所在的目录由与该系统信息库相关联的代理实例的名称标识(请参见附录 A, Message QueueTM 数据在特定平台上的位置):
…/instances/instanceName/etc/passwd
创建的系统信息库具有两个条目。表 7–1 中的每一行显示一个条目。
表 7–1 用户系统信息库中的初始条目
用户名 |
密码 |
组 |
状态 |
---|---|---|---|
admin |
admin |
admin |
处于活动状态 |
guest |
guest |
anonymous |
处于活动状态 |
这些初始条目使 Message Queue 代理安装后即可使用,不需要管理员的干预:
利用初始 admin 用户条目,您可以通过 imqcmd 命令使用默认的 admin 用户名和密码管理代理实例。您应更新此初始条目以更改密码(请参见更改默认的管理员密码)。
以下各节说明如何填充和管理平面文件用户系统信息库。
使用 Message Queue 用户管理器实用程序 (imqusermgr),您可以编辑或填充平面文件用户系统信息库。本节介绍了用户管理器实用程序。下文说明如何使用 imqusermgr 子命令完成特定任务。
有关 imqusermgr 命令的完整参考信息,请参见第 13 章,命令行参考。
使用用户管理器之前,请谨记以下事项:
如果特定于代理的用户系统信息库不存在,您必须启动相应的代理实例来创建此系统信息库。
必须在安装了代理的主机上运行 imqusermgr 命令。
您必须具有写入系统信息库的适当权限:即,在 Solaris 和 Linux 上,您的身份必须是 root 用户或首次创建代理实例的用户。
以下各节中的示例采用默认代理实例。
imqusermgr 命令包含子命令 add、delete、list 和 update。
add 子命令将用户和关联的密码添加到指定的(或默认的)代理实例系统信息库中,并可以选择指定用户所属的组。 该子命令语法如下所示:
add [-i instanceName] -u userName -p passwd [-g group] [ -s]
delete 子命令从指定的(或默认的)代理实例系统信息库中删除指定用户。 该子命令语法如下所示:
delete [-i instanceName] -u userName [ -s] [-f]
list 子命令显示有关指定的(或默认的)代理实例系统信息库中指定用户或所有用户的信息。 该子命令语法如下所示:
list [ -i instanceName] [-u userName]
update 子命令更新指定的(或默认的)代理实例系统信息库中指定用户的密码和/或状态。该子命令语法如下所示:
update [ -i instanceName] -u userName -p passwd [ -a state] [-s] [ -f]
update [-i instanceName] -u userName -a state [-p passwd] [-s] [-f]
表 7–2 列出了 imqusermgr 命令的选项。
表 7–2 imqusermgr 选项
选项 |
描述 |
---|---|
-a activeState |
指定用户是否处于活动状态 (true/false)。true 表示处于活动状态。这是默认值。 |
-f |
执行操作,无需用户确认。 |
-h |
显示用法帮助。不执行命令行上的其他选项。 |
-i instanceName |
指定命令要应用到的代理实例名。如果未指定,则采用默认实例名 imqbroker。 |
-p passwd |
指定用户密码。 |
-g group |
指定用户组。有效值包括 admin、user 和 anonymous。 |
-s |
设置无提示模式。 |
-u userName |
指定用户名。 |
-v |
显示版本信息。不执行命令行上的其他选项。 |
在代理实例的用户系统信息库中添加用户条目时,可以指定以下三个预定义组之一: admin、user 或 anonymous。如果不指定任何组,则默认属于 user 组。应按如下方式指定组:
admin 组。用于代理管理员。默认情况下,指定到该组中的用户可以配置和管理代理。您可以为 admin 组指定多个用户。
user 组。用于普通(非管理)Message Queue 客户端用户。多数客户端用户都属于 user 组。默认情况下,该组中的用户可以生成发往所有主题和队列的消息,使用来自所有主题和队列的消息,以及浏览任意队列中的消息。
anonymous 组。用于那些不想使用代理已知的用户名(可能是因为客户端应用程序不知道要使用的实际用户名)的 Message Queue 客户端。 此帐户类似于大多数 FTP 服务器中的匿名帐户。每次只能为 anonymous 组分配一个用户。 与 user 组不同,应限定 anonymous 组的访问权限,或者在部署时删除该组中的用户。
要更改用户所属的组,必须删除该用户的条目,然后为该用户添加另一个条目并为其指定新组。
您不能重命名或删除这些系统创建的组,也不能创建新组。但是,您可以指定访问规则,以定义该组的成员可以执行的操作。有关详细信息,请参见用户授权:访问控制属性文件。
向系统信息库中添加用户时,用户的默认状态是活动的。要使用户处于非活动状态,您必须使用 update 命令。例如,以下命令将使用户 JoeD 处于非活动状态:
imqusermgr update -u JoeD -a false
处于非活动状态的用户条目将保留在系统信息库中,但不能打开新连接。当某个用户处于非活动状态时,如果您试图添加具有相同名称的另一个用户,操作将失败。必须删除处于非活动状态的用户条目,或者更改新用户的名称,或者为新用户指定一个不同的名称。这样可以防止添加重复的用户名。
用户名不能包含星号 (*)、逗号 (,)、冒号 (:) 或者换行符或回车符。
用户名或密码必须至少包含一个字符。
如果用户名或密码包含空格,必须将整个用户名或密码用引号引起来。
除了命令 shell 限定的命令行中最多可输入的字符数之外,密码或用户名的长度没有限制。
要在系统信息库中添加用户,可以使用 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 服务器来管理用户系统信息库,请执行以下任务:
编辑实例配置文件
为管理员设置访问控制
要让代理使用目录服务器,请设置代理实例配置文件 config.properties 中某些属性的值。设置这些属性后,每当用户试图连接到代理实例或执行消息传送操作时,代理实例都会在 LDAP 服务器中查询有关用户和组的信息。
实例配置文件位于代理实例目录下的某个目录中。路径的格式如下:
…/instances/instanceName /props/config.properties
有关实例目录在特定操作系统中的位置的信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置
通过设置以下属性,指定您使用的是 LDAP 用户系统信息库:
imq.authentication.basic.user_repository=ldap |
设置 imq.authentication.type 属性,确定密码是以 Base64 (basic) 还是 MD5 (digest) 编码的形式从客户端传递给代理。使用 LDAP 目录服务器管理用户系统信息库时,必须将验证类型设置为 basic。例如,
imq.authentication.type=basic |
还必须设置控制 LDAP 访问的代理属性。这些属性存储在代理的实例配置文件中。安全服务对这些属性进行了讨论,安全属性对这些属性进行了总结。
Message Queue 使用 JNDI API 与 LDAP 目录服务器进行通信。有关这些属性的语法及其所引用的术语的详细信息,请查阅 JNDI 文档。Message Queue 使用 Sun JNDI LDAP 提供者并使用简单验证。
Message Queue 支持 LDAP 验证故障转移:可以指定要尝试进行验证的 LDAP 目录服务器列表(请参见 imq.user.repos.ldap.server 属性的参考信息)。
有关说明如何设置 LDAP 用户系统信息库相关属性的示例,请参见代理的 config.properties 文件。
必要时,还需要编辑访问控制属性文件中的用户/组和规则。有关使用访问控制属性文件的详细信息,请参见用户授权:访问控制属性文件。
如果您希望代理在连接验证和组搜索时通过 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 连接的任何用户或组都可以执行管理命令。
将代理属性 imq.accesscontrol.enabled 设置为 true(默认值),以允许使用访问控制文件。
imq.accesscontrol.enabled 属性允许使用访问控制文件。
打开访问控制文件 accesscontrol.properties。附录 A, Message QueueTM 数据在特定平台上的位置 中列出了该文件的位置。
该文件包含一个如下所示的条目:
service connection access control##################################connection.NORMAL.allow.user=*connection.ADMIN.allow.group=admin
列出的条目是示例。请注意,admin 组存在于基于文件的用户系统信息库中,而非默认存在于 LDAP 目录中。您必须将在 LDAP 目录中定义的组的名称替换为要为其授予 Message Queue 管理员权限的组的名称。
要为用户授予 Message Queue 管理员权限,请按如下所示输入用户名:
connection.ADMIN.allow.user= userName[[,userName2] …]
要为组授予 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 |
以下选项之一:connection、queue 或 topic。 |
resourceVariant |
resourceType 指定的类型的一个实例。例如,myQueue。通配符 (*) 可用于表示所有连接服务类型或所有物理目的地。 |
operation |
值取决于所设置的访问规则的类型。 |
access |
以下选项之一:allow 或 deny。 |
principalType |
以下选项之一:user 或 group。有关详细信息,请参见组。 |
principals |
可能具有规则左侧指定的访问权限的人。如果 principalType 为 user,则可能是单个用户或以逗号分隔的用户列表;如果 principalType 为 group,则可能是单个组或以逗号分隔的组列表。通配符 (*) 可用于表示所有用户或所有组。 |
下面是一些访问规则示例:
以下规则表示所有用户都可以向名为 q1 的队列发送消息。
queue.q1.produce.allow.user=*
以下规则表示任何用户都可以向任何队列发送消息。
queue.*.produce.allow.user=*
要指定非 ASCII 的用户、组或目的地名称,请使用 Unicode 转义符 (\\uXXXX) 表示法。如果在您编辑并保存的 ACL 文件中,这些名称采用了非 ASCII 编码,则可以通过 Java native2ascii 工具将此文件转换为 ASCII。有关更多详细信息,请参见
http://java.sun.com/j2se/1.4/docs/guide/intl/faq.html
具体的访问规则将覆盖一般访问规则。应用以下两条规则之后,所有用户都可以向所有队列发送消息,但是 Bob 不能向 tq1 发送消息。
queue.*.produce.allow.user=* queue.tq1.produce.deny.user=Bob
指定给明确 principal 的访问权限将覆盖指定给 * principal 的访问权限。以下规则将拒绝 Bob 向 tq1 发送消息,但允许其他人发送。
queue.tq1.produce.allow.user=* queue.tq1.produce.deny.user=Bob
用户的 * principal 规则将覆盖组的对应 * principal 规则。例如,以下两条规则将允许所有通过验证的用户向 tq1 发送消息。
queue.tq1.produce.allow.user=* queue.tq1.produce.deny.group=*
授予用户的访问权限将覆盖授予用户所属组的访问权限。在以下示例中,即使 Bob 是 User 的成员,他也不能生成发送到 tq1 的消息。User 的其他所有成员都可以生成此类消息。
queue.tq1.produce.allow.group=User queue.tq1.produce.deny.user=Bob
任何未通过访问规则明确授予的访问权限均默认为被拒绝。例如,如果 ACL 文件不包含任何访问规则,则所有用户的所有操作都将被拒绝。
如果同时允许和拒绝同一个用户或组的访问权限,则访问权限将相互抵消。例如,以下两条规则将使 Bob 无法浏览 q1:
queue.q1.browse.allow.user=Bob queue.q1.browse.deny.user=Bob
以下两条规则将阻止 User 组使用 q5 中的消息。
queue.q5.consume.allow.group=User queue.q5.consume.deny.group=User
如果多条规则等号左侧的内容都相同,则只有最后一条规则起作用。
ACL 属性文件中的连接访问控制部分包含代理连接服务的访问控制规则。连接访问控制规则的语法如下:
connection.resourceVariant. access.principalType= principals
为 resourceVariant 定义了两个值:NORMAL 和 ADMIN。这些预定义的值是您唯一能够授予访问权限的连接服务类型。
默认的 ACL 属性文件授予所有用户访问 NORMAL 连接服务的权限,并授予 admin 组中的用户访问 ADMIN 连接服务的权限:
connection.NORMAL.allow.user=* connection.ADMIN.allow.group=admin
如果您使用的是基于文件的用户系统信息库,则默认组 admin 由用户管理器实用程序创建。如果您使用的是 LDAP 用户系统信息库,则可以通过执行以下操作之一来使用默认 ACL 属性文件:
在 LDAP 目录中定义一个名为 admin 的组。
使用在 LDAP 目录中定义的一个或多个组的名称来替换 ACL 属性文件中的名称 admin。
您可以对连接访问权限加以限定。例如,以下规则拒绝 Bob 访问 NORMAL,但允许其他人访问:
connection.NORMAL.deny.user=Bob connection.NORMAL.allow.user=*
可以使用星号 (*) 指定所有通过验证的用户或组。
使用 ACL 属性文件来授权访问 ADMIN 连接的方式与使用基于文件的用户系统信息库和 LDAP 用户系统信息库不同,如下所示:
LDAP 用户系统信息库。如果您使用的是 LDAP 用户系统信息库,请执行下列所有操作:
启用访问控制。
编辑 ACL 文件并提供可以建立 ADMIN 连接的用户或组的名称。指定在 LDAP 目录服务器中定义的任何用户或组。
访问控制属性文件的目的地访问控制部分包含基于物理目的地的访问控制规则。这些规则决定谁(用户/组)可以在哪里(物理目的地)执行什么(操作)。这些规则控制的访问类型包括向队列发送消息、向主题发布消息、从队列接收消息、订阅主题以及浏览队列中的消息。
默认情况下,任何用户或组都可以对任何物理目的地进行任意类型的访问。您可以添加更多特定的目的地访问规则或编辑默认的规则。本节的余下部分介绍物理目的地访问规则的语法,您必须理解这些语法才能编写自己的规则。
目的地规则的语法如下:
resourceType.resourceVariant.operation.access.principalType=principals
表 7–4 介绍了这些元素:
表 7–4 物理目的地访问控制规则的元素
组件 |
描述 |
---|---|
resourceType |
可以是 queue 或 topic。 |
resourceVariant |
某个物理目的地名或所有物理目的地 (*),星号表示所有队列或所有主题。 |
operation |
可以是 produce、consume 或 browse。 |
access |
可以是 allow 或 deny。 |
principalType |
可以是 user 或 group。 |
可以将访问权限授予一个或多个用户和/或组。
以下示例说明了不同类型的物理目的地访问控制规则:
允许所有用户向任意 queue 目的地发送消息。
queue.*.produce.allow.user=*
拒绝 user 组的任何成员订阅 Admissions 主题的能力。
topic.Admissions.consume.deny.group=user
ACL 属性文件最后一部分所包括的访问规则指定代理将为哪些用户和组自动创建物理目的地。
当用户在尚不存在的物理目的地上创建生成方或使用方时,如果已启用代理的自动创建属性,则代理将会创建该目的地。
默认情况下,任何用户或组都有权让代理为其自动创建一个物理目的地。此权限由以下规则指定:
queue.create.allow.user=* topic.create.allow.user=*
您可以编辑 ACL 文件以限制此类访问权限。
物理目的地自动创建访问规则的一般语法如下:
resourceType.create.access.principalType=principals
其中 resourceType 为 queue 或 topic。
例如,以下规则允许代理为除 Snoopy 之外的每个用户自动创建 topic 目的地。
topic.create.allow.user=* topic.create.deny.user=Snoopy
请注意,物理目的地自动创建规则的效果必须与物理目的地访问规则的效果一致。例如,如果您 1) 更改目的地访问规则,禁止任何用户向目的地发送消息;但是 2) 启用了目的地的自动创建,那么如果目的地不存在,代理将创建一个物理目的地,但不会向该目的地发送任何消息。
本节将说明如何设置基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务,此连接服务在客户端与代理之间发送加密的消息。Message Queue 支持以下基于 SSL 的连接服务:
ssladmin 服务可使用 TCP/IP 传输协议在 Message Queue 命令实用程序 (imqcmd) 与代理之间创建一个安全的加密连接。不支持管理控制台 (imqadmin) 加密连接。
httpsjms 服务可使用 HTTPS 隧道 Servlet 通过 HTTP 传输协议在客户端与代理之间传送安全加密的消息。
本节后面部分将介绍如何使用 ssljms、 ssladmin 和 cluster 连接服务通过 TCP/IP 建立安全连接。有关使用 httpsjms 服务通过 HTTP 建立安全连接的信息,请参见附录 C,HTTP/HTTPS 支持。
要使用通过 TCP/IP 建立的基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成公钥/私钥对。此实用程序将公钥嵌入自签名证书,此证书将传递给请求连接到代理的任何客户端,客户端需要使用该证书建立加密连接。本节介绍如何使用这样的自签名证书来设置基于 SSL 的服务。
如果需要更严密的验证,您可以使用由证书颁发机构验证的签名证书。若要使用签名证书,则除了使用自签名证书需要的步骤外,还需要其他一些步骤:必须先执行本节中介绍的步骤,然后再执行使用签名证书中的其他步骤。
Message Queue 对带有自签名证书的 SSL 支持用于保护所传输数据的安全性,并假定客户端正在与已知且可信任的服务器进行通信。以下过程说明了设置基于 SSL 的连接服务以使用自签名证书所需的步骤。下面各节更详细地介绍了每个步骤。
生成自签名证书。
在代理中启用 ssljms、ssladmin 或 cluster 连接服务。
启动代理。
配置并运行客户端。
此步骤仅适用于 ssljms 连接服务,不适用于 ssladmin 或 cluster 。
运行密钥工具实用程序 (imqkeytool) 为代理生成自签名证书。(在 UNIX® 系统上,您可能需要以超级用户 (root) 身份运行该实用程序,才能获取创建密钥库的权限。)可以对 ssljms、ssladmin 或 cluster 连接服务使用相同的证书。
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 密钥库的可配置属性:
imq.keystore.file.dirpath:包含密钥库文件的目录的路径。有关默认值的信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置。
有时候您可能需要重新生成密钥对才能解决某些问题:例如,如果您在启动代理时忘记了密钥库密码或基于 SSL 的服务初始化失败,并收到了异常:
java.security.UnrecoverableKeyException:Cannot recover key
(出现异常的原因可能是因为您提供的密钥密码与您生成自签名证书时的密钥库密码不同。)
删除代理的密钥库。有关密钥库的位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置。
再次运行 imqkeytool 生成新密钥对,如上所述。
要在代理中启用基于 SSL 的连接服务,您需要将 ssljms(或 ssladmin)添加到 imq.service.activelist 属性。
打开代理的实例配置文件。
实例配置文件位于一个由代理实例名称 (instanceName) 标识的目录中,而该实例名称与此配置文件是相关联的(请参见附录 A, Message QueueTM 数据在特定平台上的位置):
.../instances/instanceName/props/config.properties
为 imq.service. activelist 属性添加一个条目(如果此条目尚不存在),并将需要的基于 SSL 的服务包括在列表中。
默认情况下,此属性包括 jms 和 admin 连接服务。添加基于 SSL 的服务或希望激活的服务(ssljms 和/或 ssladmin):
imq.service.activelist=jms,admin,ssljms,ssladmin
基于 SSL 的 cluster 连接服务是使用 imq.cluster.transport 属性启用的,而不是使用 imq.service. activelist 属性启用的;请参见连接代理。
保存并关闭实例配置文件。
启动代理并提供密钥库密码。您可以通过以下两种方式之一提供密码:
让代理启动时提示您输入密码:
imqbrokerd Please enter Keystore password:
将密码放在密码文件中,如密码文件中所述。然后设置属性 imq.passfile.enabled = true 后,执行以下操作之一:
将密码文件的位置传递给 imqbrokerd 命令:
imqbrokerd -passfile /passfileDirectory/passfileName
启动代理时不使用 -passfile 选项,但使用以下两个代理配置属性指定密码文件的位置:
imq.passfile.dirpath=/passfileDirectory imq.passfile.name=passfileName
启用带有 SSL 的代理或客户端时,您可能会注意到它在几秒钟内使用了大量的 CPU 资源。这是因为 Message Queue 使用 JSSE(Java Secure Socket Extension,Java 安全套接扩展)方法 java.security.SecureRandom 来生成随机数,此方法需要大量时间生成初始随机数初始化向量。生成初始化向量后,CPU 的使用率将降到正常水平。
配置客户端以使用基于 SSL 的连接服务的过程各有不同,具体情况取决于客户端是应用程序客户端(使用 ssljms 连接服务)还是 imqcmd 之类的 Message Queue 管理客户端(使用 ssladmin 连接服务。)
对于应用程序客户端,您必须确保客户端在其 CLASSPATH 变量中指定了 .jar 文件:
imq.jar
jms.jar
如果您使用的是 Java 2 Software Development Kit (J2SDK) 1.4 之前的版本,您还必须包括 Java 安全套接扩展 (Java Secure Socket Extension, JSSE) 和 Java 命名和目录接口 (Java Naming and Directory Interface, JNDI) .jar 文件:
jsse.jar
jnet.jar
jcert.jar
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. |
签名证书可以提供比自签名证书更严密的服务器验证。您只能在客户端与代理之间实现签名证书,而不能在群集中的多个代理之间实现签名证书。除了上面介绍的配置自签名证书的步骤外,使用签名证书还需要其他一些步骤(见下文)。以下各节更详细地介绍了这些步骤。
以下过程说明如何获取和安装签名证书。
使用 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 )。
使用 CSR 生成或请求签名证书。
您可以通过以下两种方法之一完成:
由众所周知的证书颁发机构 (Certificate Authority, CA) 签署证书,如 Thawte 或 Verisign。有关如何操作的详细信息,请参见 CA 的文档。
使用 SSL 签名软件包亲自对证书进行签名。
最终的签名证书是一个 ASCII 字符序列。如果从 CA 收到签名证书,它可能是电子邮件附件或消息文本。
将签名证书保存到文件中。
以下说明使用示例名 broker.cer 来表示代理证书。
检查 J2SE 是否默认支持您的证书颁发机构。
此命令列出系统密钥库中的根 CA:
keytool -v -list -keystore $JAVA_HOME/lib/security/cacerts
如果您的 CA 已列出,请跳过下一步。
如果 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 应提供有关如何获取副本的说明。
将签名证书导入到密钥库中以替换原来的自签名证书。
下面是一个示例:
keytool -import -alias imq -file broker.cer -noprompt -trustcacerts -keystore /etc/imq/keystore -storepass myStorePassword
其中 broker.cer 是包含从 CA 收到的签名证书的文件。
Message Queue 密钥库现在包含一个用于 SSL 连接的签名证书。
现在,您必须将 Message Queue 客户端运行时环境配置为请求签名证书,并确保客户端信任对该证书进行签名的证书颁发机构。
将连接工厂的 imqSSLIsHostTrusted 属性设置为 false。
默认情况下,客户端用来建立代理连接的连接工厂对象的 imqSSLIsHostTrusted 属性被设置为 true,表示客户端运行时环境将接受提供给它的任何证书。您必须将此值更改为 false,这样客户端运行时环境将尝试验证所有提供给它的证书。 如果证书签署人不在客户端的信任库中,验证将会失败。
验证签名机构是否已在客户端的信任库中注册。
要测试客户端是否会接受由您的证书颁发机构签名的证书,请尝试建立 SSL 连接,如上文配置并运行基于 SSL 的客户端中所述。如果 CA 在客户端的信任库中,连接将会成功,您可以跳过下一步。如果连接由于证书验证错误而失败,请执行下一步。
在客户端的信任库中安装签名 CA 的根证书。
默认情况下,客户端搜索密钥库文件 cacerts 和 jssecacerts,因此,如果您在两个文件中的任何一个中安装了证书,则无需进行进一步的配置。以下示例将文件 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 密码文件中的密码
Message Queue 产品提供了样例密码文件。有关样例文件位置的信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置。
当客户端应用程序与代理被防火墙隔开时,需要使用一些特殊的方法来建立连接。一种方法是使用 httpjms 或 httpsjms 连接服务(可以使用“隧道”通过防火墙);有关详细信息,请参见附录 C,HTTP/HTTPS 支持。但是 HTTP 连接比其他连接服务慢,一种更快的选择是绕过 Message Queue 端口映射器,并明确地为所需的连接服务指定静态端口地址,然后在防火墙中打开该特定端口。可以使用该方法以及 jms 或 ssljms 连接服务(在特殊情况下,使用 admin 或 ssladmin 连接服务)通过防火墙建立连接。
表 7–8 静态端口地址的代理配置属性
连接服务 |
配置属性 |
---|---|
jms |
imq.jms.tcp.port |
ssljms |
imq.ssljms.tls.port |
admin |
imq.admin.tcp.port |
ssladmin |
imq.ssladmin.tls.port |
为要使用的连接服务指定静态端口地址。
要绕过端口映射器直接为某个连接服务指定静态端口号,请设置代理配置属性 imq.serviceName. protocolType.port,其中 serviceName 是连接服务的名称,而 protocolType 是其协议类型(请参见表 7–8)。与所有代理配置属性一样,您可以在代理的实例配置文件中指定该属性,也可以在启动代理时通过命令行指定。例如,要为 jms 连接服务指定端口号 10234,可以在配置文件中包括以下命令行:
imq.jms.tcp.port=10234
也可以在启动代理时使用以下命令:
imqbrokerd -name myBroker -Dimq.jms.tcp.port=10234
配置防火墙以允许连接到为连接服务指定的端口号。
您还必须允许连接能通过防火墙连接到 Message Queue 的端口映射器端口(通常是 7676,除非将端口映射器重新指定到其他一些端口)。例如,在上面的示例中,需要在防火墙中打开端口 10234 和 7676。
Message Queue 仅在 Enterprise Edition 中支持审计日志记录。启用审计日志记录后,Message Queue 将为下列类型的事件生成记录:
启动、关闭、重新启动以及删除代理实例
用户验证和授权
重置持久性存储库
创建、清除以及销毁物理目的地
以管理方式销毁长期订户
要将审计记录记录到 Message Queue 代理日志文件中,请将 imq.audit.enabled 代理属性设置为 true 。日志中的所有审计记录都包含关键字 AUDIT。