Sun ONE logo     上一个      目录      索引      下一个     
Sun ONE Message Queue, Version 3.0.1 管理员指南



第 8 章   安全性管理

本章介绍如何执行与安全性相关的任务,包含验证、授权和加密。

验证用户    您负责维护用户列表、用户组以及用户系统信息库中的密码。本章第一部分介绍如何创建、填充和管理系统信息库。有关 Sun™ ONE Message Queue (MQ) 安全性的介绍,请参阅安全性管理器

授权用户    您负责编辑属性文件,此属性文件用于将用户对代理操作的访问权限映射到用户名或用户组。本章第二部分介绍如何自定义此属性文件。

加密:设置 SSL 服务    使用基于安全套接字层 (SSL) 标准的连接服务可以对客户机与代理之间传送的消息进行加密。有关 MQ 如何处理加密的介绍,请参阅加密(企业版)。本章最后一部分介绍如何设置基于 SSL 的连接服务,并提供了与 SSL 有关的其它信息。

在代理需要提供密码才能安全访问 SSL 键存储、LDAP 用户系统信息库或 JDBC 兼容持久性存储器的情况下,提供密码的方式有三种:

  • 让系统在代理启动时提示您输入密码
  • 启动代理时通过命令行选项提供密码(请参阅启动代理表 5-2
  • 将密码存储在代理启动时可以访问的密码文件中(请参阅使用密码文件

验证用户

当某个用户试图与代理建立连接时,代理将通过检查该用户提供的用户名和密码对其进行验证。如果用户提供的用户名和密码与配置代理时指定要参照的用户系统信息库中的用户名和密码相匹配,则允许该用户连接到该代理。系统信息库有两种类型:

  • MQ 出厂时附带的文本文件系统信息库
  • 这种用户系统信息库易于使用,但容易受到安全性攻击,因此用于测试和开发目的。您可以使用用户管理器实用程序 (imqusermgr) 填充和管理系统信息库。要启用验证,您需要用每个用户名、密码和用户组名称填充用户系统信息库。

    有关设置和管理用户系统信息库的详细信息,请参阅使用文本文件用户系统信息库

  • LDAP 服务器
  • 这可以是现有的或新的 LDAP 目录服务器,这种服务器上的用户系统信息库使用 LDAP v2 或 v3 协议。它并不象文本文件系统信息库那样易于使用,但它更安全,因此更适用于生产环境。

    如果您目前使用的是 LDAP 用户系统信息库,您需要使用 LDAP 供应商提供的工具来填充和管理该用户系统信息库。有关详细信息,请参阅使用 LDAP 服务器管理用户系统信息库

使用文本文件用户系统信息库

MQ 提供了一个文本文件用户系统信息库,还提供了一个命令行工具 MQ 用户管理器 (imqusermgr),您可以使用它填充和管理文本文件用户系统信息库。以下各节介绍文本文件系统信息库、信息库的初始条目以及如何填充和管理该信息库。

默认的文本文件系统信息库位于以下位置:

IMQ_HOME/etc/passwd(在 Solaris 操作系统上为 /etc/imq/passwd

系统信息库出厂时附带了两个已定义的条目(行),如下表所示。

表 8-1    用户系统信息库中的初始条目 

用户名

密码

状态

admin
 
admin
 
admin
 
active
 
guest
 
guest
 
anonymous
 
active
 

这些初始条目使 MQ 代理安装后即可使用,无需任何管理员的介入。换句话说,使用 MQ 代理之前无需设置初始用户/密码。

初始 guest 用户条目使 JMS 客户机可以使用默认的 guest 用户名和密码连接到代理(例如,用于测试目的)。

初始 admin 用户条目使您可以通过 imqcmd 命令,使用默认的 admin 用户名和密码管理代理。建议您更新此初始条目以更改密码。

您可以使用用户管理器实用程序编辑或填充文本文件用户系统信息库,而不需要首先配置或启动代理。使用用户管理器实用程序的唯一要求是要在安装代理的主机上运行它,此外,如果您需要对系统信息库执行写入操作,则必须具有相应的权限:

  • 在 Solaris 操作系统上,可以以 root 用户身份或者以其它通过基于 Solaris 角色访问控制获得访问权限的非 root 用户身份运行用户管理器实用程序。要获得此类访问权限,root 用户需要按照以下格式在 /etc/user_attr 中添加一个条目:
  • username::::type=normal;profiles=Message Queue Management

    此操作将指定用户添加到 MQ 权限简要表中。要使用此设备,首先需要运行简要表 shell(pfshpfkshpfcsh),例如:

    % /usr/bin/pfsh

    然后执行所需的用户管理器 (imqusermgr) 命令。

    有关基于 Solaris 角色的访问控制的详细信息,请访问:http://docs.sun.com/
    ?q=Rights+Profile&p=/doc/806-4078/6jd6cjrvl&a=view

  • 在 Windows 操作系统上,安装后,任何用户都可以写入用户系统信息库文件,因为操作系统没有使用基于用户名权限属性控制对文件的访问。

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

用户管理器实用程序 (imqusermgr)

可以使用用户管理器实用程序管理基于文件的用户系统信息库。本节介绍了基本的 imqusermgr 命令语法,提供了一个子命令列表,并概述了 imqusermgr 命令选项。下文说明如何使用 imqobjmgr 子命令完成特定任务。

命令语法

imqusermgr 命令的一般语法如下:

imqusermgr subcommand [options]
imqusermgr -h
imqusermgr -v

请注意,如果指定 -v 或 -h 选项,将不会执行命令行中指定的子命令。例如,输入以下命令将显示版本信息,而不是执行 list 子命令。

imqusermgr list -v

imqusermgr 子命令

表 8-2 列出了 imqusermgr 子命令。

表 8-2    imqusermgr 子命令 

子命令

说明

add -u name -p passwd [-g group] [-s]
 

将用户和关联的密码添加到系统信息库中,并有选择地指定用户所属的组。

 
delete -u name [-s] [-f]
 

从系统信息库中删除指定用户。

 
list [-u name]
 

显示指定用户或所有用户的相关信息。

 
update -u name -p passwd [-a state] [-s] [-f]
update -u name -a state [-p passwd] [-s] [-f]
 

更新指定用户的密码和/或状态。

 

imqusermgr 命令选项概述

表 8-3 列出了 imqusermgr 命令的选项。

表 8-3    imqusermgr 选项 

选项

说明

-a active_state
 

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

 
-f
 

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

 
-h
 

显示使用帮助。不执行命令行上的命令。

 
-p passwd
 

指定用户密码。

 
-g group
 

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

 
-s
 

设置无提示模式。

 
-u name
 

指定用户名。

 
-v
 

显示版本信息。不执行命令行上的命令。

 

在系统信息库中添加用户条目时,管理员可以为该用户指定三个预定义组中的一个组,这三个组为:adminuseranonymous。如果不指定任何组,则默认属于 user 组。

  • admin 组用于代理管理员。默认情况下,指定到该组中的用户可以配置和管理代理。管理员可以为 admin 组指定多个用户。
  • user 组用于一般(非管理)JMS 客户机应用程序。多数 MQ 客户机应用程序将访问在 user 组中获得授权的代理。同样,默认情况下,客户机应用程序可以生成和使用所有主题和队列的消息,也可以浏览任意队列中的消息。
  • anonymous 组用于那些不想使用代理知道的用户名(也许应用程序不知道可以使用的实际用户名)的 JMS 客户机应用程序。这类似于多数 FTP 服务器中的匿名帐户。管理员一次只能为 anonymous 组指定一个用户。与 user 组相比,您需要通过访问控制限制此组的访问权限,或者在部署时从此组中删除这个用户。

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

您可以指定访问规则,定义组成员可以执行哪些操作。有关详细信息,请参阅授权用户:访问控制属性文件

状态

当管理员将用户添加到系统信息库时,默认情况下用户处于活动状态。要使用户处于非活动状态,管理员必须使用 update 命令。例如,以下命令将使用户 JoeD 处于非活动状态:

imqusermgr update -u JoeD -a false

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

用户名和密码的格式

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

  • 用户名和密码不能包含表 8-4 中列出的字符。
  • 表 8-4    用户名和密码中不能包含的字符 

    字符

    说明

    *

     

    星号

     

    ,

     

    逗号

     

    :

     

    冒号

     

  • 用户名和密码不能包含新行符或回车符。
  • 如果用户名或密码包含空格,必须将整个用户名或密码放在引号中。
  • 用户名或密码必须至少包含一个字符。
  • 除了命令 shell 规定的命令行中最多可输入的字符数之外,密码或用户名的长度没有限制。

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

要在系统信息库中添加用户,可以使用 add 子命令。例如,以下命令将添加用户名为 Katharine,密码为 sesame 的用户。

imqusermgr add -u Katharine -p sesame -g user

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

imqusermgr delete -u Bob

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

imqusermgr update -u Katharine -p alladin

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

imqusermgr list -u isa


----------------------------------
User Name    Group     Active State
----------------------------------
isa          admin    true


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

imqusermgr list


--------------------------------------
User Name    Group        Active State
--------------------------------------
testuser3    user         true
testuser2    user         true
testuser1    user         true
isa          admin        true
admin        admin        true
guest        anonymous    true
testuser5    user         false
testuser4    user         false

更改默认的管理员密码

为安全起见,必须将 admin 的默认密码更改为只有您自己知道的密码。为此,需要使用 imqusermgr 工具。

以下命令将默认密码更改为 grandpoobah

imqusermgr update -u admin -p grandpoobah

要快速确认此更改是否已生效,可以在代理运行时运行任何命令行工具。例如,可以使用以下命令:

imqcmd list svc -u admin -p grandpoobah

使用旧密码时将失败。

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

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

如果要使用 LDAP 服务器管理用户系统信息库,必须在实例配置文件中设置某些代理属性。设置这些属性后,当某个用户试图连接到代理或执行某些操作时,代理将在 LDAP 服务器中查询用户和组的相关信息。实例配置文件位于以下位置:

IMQ_VARHOME/instances/brokerName/props/config.properties
(在 Solaris 操作系统上为 /var/imq/instances/brokerName/props/config.properties

编辑配置文件以使用 LDAP 服务器的步骤

  1. 通过设置以下属性,指定您正在使用 LDAP 用户系统信息库:
  2. imq.authentication.basic.user_repository=ldap

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

  5. 还必须设置控制 LDAP 访问的代理属性。表 8-5 列出了存储在代理实例配置文件中的这些属性。MQ 使用 JNDI API 与 LDAP 目录服务器进行通信。有关这些属性的语法及其所引用术语的详细信息,请参阅 JNDI 文档。MQ 3.0.1 使用 Sun JNDI LDAP 提供者并使用简单验证。
  6. 表 8-5    LDAP 相关属性 

    属性

    说明

    imq.user_repository.
    ldap.server

     

    LDAP 服务器的 host:port。host 指定运行目录服务器的主机的全限定 DNS 名称。port 指定目录服务器用于通信的端口号。

     
    imq.user_repository.
    ldap.principal

     

    代理用来绑定到目录服务器以进行搜索时使用的独特名称。如果目录服务器允许匿名搜索,则无需为此属性指定值。

     
    imq.user_repository.
    ldap.password

     

    与代理使用的独特名称关联的密码。只能在密码文件中指定(请参阅使用密码文件)。为了增强安全性,最好让代理提示您输入密码,或使用以下命令行选项指定密码:imqbrokerd -ldappassword

    如果目录服务器允许匿名搜索,则无需输入密码。

     
    imq.user_repository.
    ldap.base

     

    用户条目的目录库。

     
    imq.user_repository.
    ldap.uidattr

     

    提供者特定的属性标识符,其值用于唯一标识一个用户。例如:uidcn 等。

     
    imq.user_repository.
    ldap.usrfilter

     

    JNDI 搜索过滤器(以逻辑表达式的形式表示搜索查询)。通过为用户指定搜索过滤器,代理可以缩小搜索范围,从而使搜索更有效。有关详细信息,请参阅位于以下位置的 JNDI 教程:http://java.sun.com/products/jndi/tutorial。

    此属性并不是必须设置的。

     
    imq.user_repository.
    ldap.grpsearch

     

    指定是否启用组搜索的布尔值。请参阅 LDAP 提供者提供的文档,决定您是否可以将用户与组相关联。

    请注意,MQ 3.0.1 不支持嵌套组。

    默认值:false

     
    imq.user_repository.
    ldap.grpbase

     

    组条目的目录库。

     
    imq.user_repository.
    ldap.gidattr

     

    提供者特定的属性标识符,其值为组名。

     
    imq.user_repository.
    ldap.memattr

     

    组条目中的属性标识符,其值是组成员的独特名称。

     
    imq.user_repository.
    ldap.grpfiltler

     

    JNDI 搜索过滤器(以逻辑表达式的形式表示搜索查询)。通过为组指定搜索过滤器,代理可以缩小搜索范围,从而使搜索更有效。有关详细信息,请参阅位于以下位置的 JNDI 教程:

    http://java.sun.com/products/jndi/tutorial

    此属性并不是必须设置的。

     
    imq.user_repository.
    ldap.timeout

     

    指定搜索的时间限制(以秒为单位)的一个整数。默认值为 180 秒。

     
    imq.user_repository.
    ldap.ssl.enabled

     

    指定代理在与 LDAP 服务器通信时是否应使用 SSL 协议的布尔值。默认值为 false

     

    请参阅代理的 default.properties 文件,查看实例(默认)LDAP 用户系统信息库相关属性的设置。

  7. 必要时还需要编辑访问控制属性文件中的用户/组和规则。有关使用访问控制属性文件的详细信息,请参阅授权用户:访问控制属性文件
  8. 如果您希望代理在连接验证和组搜索时通过 SSL 与 LDAP 目录服务器进行通信,您需要在 LDAP 服务器中激活 SSL,然后在代理配置文件中设置以下属性:
    • 为 LDAP 用户系统信息库属性指定一个安全端口。例如:
    • imq.user_repository.ldap.server=myhost:7878

    • 将代理属性 imq.user_repository.ldap.ssl.enabled
      设置为 true

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

连接到代理后,用户可能希望生成消息、在目标上使用消息或在队列目标上浏览消息。当用户试图进行此类操作时,代理将检查访问控制属性文件(ACL 文件),确认该用户是否有权执行此操作。ACL 文件包含指定某个用户(或一组用户)可以执行哪些操作的规则。默认情况下,所有授权用户都可以在任何目标上生成和使用消息。您可以编辑访问控制属性文件,将这些操作限制到某些用户和组。

不管用户信息是放置在文本文件系统信息库中还是放置在 LDAP 系统信息库中,都使用 ACL 文件。默认的 ACL 属性文件与代理一起安装。它的名称为 accesscontrol.properties,安装程序将其放置在以下目录中:

IMQ_HOME/etc(在 Solaris 操作系统上为 /etc/imq

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

  • 连接访问控制
  • 目标访问控制
  • 目标自动创建访问控制

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

version=JMQFileAccessControlModel/100

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

访问规则语法

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

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

resourceType.resourceVariant.operation.access.principalType = principals

表 8-6 介绍了语法规则的元素。

表 8-6    访问规则的语法元素 

元素

说明

resourceType
 

下列选项之一:connection、queuetopic

 
resourceVaria nt
 

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

 
operation
 

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

 
access
 

下列选项之一:allowdeny

 
principalType
 

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

 
principals
 

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

 

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

  • 以下规则表示所有用户都可以向名为 ql 的队列发送消息。
  • queue.q1.produce.allow.user=*

  • 以下规则表示任何用户都可以向任何队列发送消息。
  • queue.*.produce.allow.user=*



要指定非 ASCII 用户、组或目标名称,必须使用 Unicode 换码符 (\uXXXX) 表示法。如果在您编辑并保的 ACL 文件中,这些名称采用了非 ASCII 编码,则可以通过 Java native2ascii 工具将此文件转换为 ASCII。有关详细信息,请访问 http://java.sun.com/j2se/1.3/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”组中的其他成员则可以向 tq1 发送消息。
  • queue.tq1.produce.allow.group=User

    queue.tq1.produce.deny.user=Bob

  • 任何未通过访问规则明确授予的访问权限均默认为被拒绝。例如,如果 ACL 文件不包含任何访问规则,则所有用户的所有操作都将被拒绝。
  • 如果同时允许和拒绝同一个用户或组的访问权限,则访问权限将相互抵消。例如,以下两条规则将使 Bob 无法浏览 t1:
  • 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 定义了两个值:NORMALADMIN。默认情况下,所有用户都可以访问 NORMAL 类型的连接服务,但只有 admin 组中的用户可以访问 ADMIN 类型的连接服务。

您可以编辑连接访问控制规则,限制某个用户的连接访问权限。例如,以下规则将拒绝 Bob 访问 NORMAL,但允许其他人访问:

connection.NORMAL.deny.user=Bob

connection.NORMAL.allow.user=*

可以使用星号 (*) 指定所有授权用户或组。

不能创建自己的服务类型,只能使用常量 NORMALADMIN 指定的预定义类型。

目标访问控制

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

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

目标规则的语法如下:

resourceType.resourceVariant.operation.access.principalType = principals

表 8-7 列出了这些元素:

表 8-7    目标访问控制规则的元素

组件

说明

resourceType
 

必须是 queuetopic 其中之一。

 
resourceVariant
 

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

 
operation
 

必须是 produceconsumebrowse 其中之一。

 
access
 

必须是 allowdeny 其中之一。

 
principalType
 

必须是 usergroup 其中之一。

 

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

以下实例说明了不同类型的目标访问控制规则:

  • 允许所有用户向任意 queue 目标发送消息。
  • queue.*.produce.allow.user=*

  • 拒绝 user 组的任何成员订阅 Admissions 主题。
  • topic.Admissions.consume.deny.group=user

目标自动创建访问控制

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

当用户在尚不存在的目标上创建生成方或使用方时,如果代理的 auto-create 属性已启用且物理目标尚不存在,代理将会创建该目标。

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

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) 启用了目标的自动创建,那么如果目标不存在,代理创建一个目标,但不会向该目标发送任何消息。

加密:使用 SSL 服务(企业版)

MQ Enterprise Edition 支持基于安全套接字层 (SSL) 标准的连接服务:通过 TCP/IP(ssljms 和 ssladmin)和通过 HTTP (httpsjms)。这些基于 SSL 的连接服务允许对在客户机和代理之间传递的消息进行加密。当前的 MQ 发行版支持基于自签名服务器证书的 SSL 加密。

要使用基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成专用密钥/公用密钥对。此实用程序将公用密钥嵌入自签名证书,此证书将传递给请求连接代理的客户机,客户机需要使用该证书建立加密连接。

尽管 MQ 基于 SSL 的连接服务在概念上很相似,但它们的设置方法却不尽相同。因此以下各节将分别讨论通过 TCP/IP 和通过 HTTP 的安全连接。

设置通过 TCP/IP 的 SSL 服务

有两种基于 SSL 的连接服务通过 TCP/IP 提供直接、安全的连接。

ssljms    此连接服务用于在客户机和代理之间通过安全、加密的连接传送 JMS 消息。

ssladmin    此连接服务用于在命令行实用程序 (imqcmd)(命令行管理工具)和代理之间创建安全、加密的连接。不支持管理控制台 (imqadmin) 安全连接。

设置 ssljms 连接服务的步骤

  1. 生成自签名证书。
  2. 在代理中启用 ssljms 连接服务。
  3. 启动代理。
  4. 配置并运行客户机。
设置 ssljms 和 ssladmin 连接服务的过程基本相同,不同之处在于步骤 4,配置并运行客户机。

下文详细介绍了每个步骤。

步骤 1:生成自签名证书

MQ 3.0.1 中的 SSL 支持用于保护所传输数据的安全,假定客户机正在与已知且可信任的服务器进行通信。因此,在 MQ 3.0.1 中,仅使用自签名证书实现 SSL。

运行 imqkeytool 命令,为代理生成自签名证书。可以对 ssljms 和 ssladmin 连接服务使用相同的证书。在命令提示符下输入以下内容:

imqkeytool -broker

命令行实用程序会提示您提供所需的信息。(在 Unix 操作系统上,可能需要以超级用户 [root 用户] 身份运行 imqkeytool 命令,以获得创建键存储所需的权限。)

首先,imqkeytool 提示您输入键存储密码,然后提示您输入组织信息,最后提示您进行确认。收到您的确认后,它将在生成键对时暂停。然后它要求您输入密码以锁定特定关键字对(关键字密码),此时请按回车键响应此提示:这将使关键字密码与键存储密码相同。



请记住您提供的密码,稍后(启动代理时)您需要向代理提供此密码,使代理可以打开键存储。您还可以将键存储密码存储在密码文件中(请参阅使用密码文件)。



运行 imqkeytool 以运行 JDK keytool 实用程序,生成自签名证书并将其放置在位于以下位置的 MQ 键存储中:

IMQ_HOME/etc/keystore(在 Solaris 上操作系统上为 /etc/imq/keystore

键存储格式与 JDK1.2 keytool 实用程序支持的格式相同。

表 8-8 列出了 MQ 键存储的配置属性。(有关配置这些属性的说明,请参阅第 5 章“启动与配置代理”)。

表 8-8    键存储属性 

属性名称

说明

imq.keystore.file.
dirpath

 

适用于基于 SSL 的服务:指定包含键存储文件的目录的路径。
默认值:IMQ_HOME/etc(在 Solaris 操作系统上为 /etc/imq/

 
imq.keystore.file.name
 

适用于基于 SSL 的服务:指定键存储文件的名称。
默认值:keystore

 
imq.keystore.password
 

适用于基于 SSL 的服务:指定键存储密码。只能存储在密码文件中(请参阅使用密码文件)。为了增强安全性,最好让代理提示您输入密码,或使用以下命令行选项指定密码:imqbrokerd -password

 

您可能需要重新生成密钥对以解决某些问题,例如:

  • 您忘记了键存储密码。
  • 启动代理时 SSL 服务初始化失败并出现异常:
    java.security.UnrecoverableKeyException:Cannot recover key.
  • 出现异常的原因可能是您提供的密码与您在步骤 1:生成自签名证书中生成自签名证书时的键存储密码不同。

重新生成密钥对的步骤

  1. 删除代理的键存储,它位于以下位置:
  2. IMQ_HOME/etc/keystore(在 Solaris 上操作系统上为 /etc/imq/keystore

  3. 再次运行 imqkeytool,生成步骤 1:生成自签名证书中描述的密钥对。

步骤 2:在代理上启用基于 SSL 的服务

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

  1. 打开代理的实例配置文件。您可以从以下位置找到它:
  2. IMQ_VARHOME/instances/brokerName/props/config.properties
    (在 Solaris 操作系统上为 /var/imq/instances/brokerName/props/config.properties

    其中 brokerName 是代理实例的名称。

  3. ssljms 和/或 ssladmin 值(取决于您需要的服务)添加到 imq.service.activelist 属性中:
  4. imq.service.activelist=jms,admin,httpjms,ssljms, ssladmin

步骤 3:启动代理

启动代理并提供键存储密码。可以通过以下方法之一提供密码:

  • 让代理启动时提示您输入密码:
  • imqbrokerd
    Please enter Keystore password:mypassword

  • 使用 imqbrokerd 命令的 -password 选项:
  • imqbrokerd -password mypassword

  • 将密码放在代理启动时访问的密码文件中(请参阅使用密码文件)。您需要首先设置以下代理配置属性(请参阅编辑实例配置文件):
  • imq.passfile.enabled=true

    设置此属性后,您可以通过以下两种方式之一访问密码文件:

    • 将密码文件的位置传递给 imqbrokerd 命令:
    • imqbrokerd -passfile /tmp/mypassfile

    • 启动代理时不选择 -passfile 选项,但使用以下两个代理配置属性指定密码文件的位置:
    • imq.passfile.dirpath=/tmp

      imq.passfile.name=mypassfile

要查看与密码文件相关的代理属性列表,请参阅表 2-6

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

步骤 4:配置并运行基于 SSL 的客户机

最后,您需要配置客户机以使用安全连接服务。根据您使用的连接服务,有两种类型的客户机:使用 ssljms 的 JMS 客户机和使用 ssladmin 的 MQ 管理命令行实用程序 (imqcmd)。下面分别介绍这两种客户机。

JMS 客户机

您需要确保客户机的类路径中有必需的安全套接扩展 (JSSE) Jar 文件,还需要告诉该文件使用 ssljms 连接服务。

  1. 如果您的客户机不是使用 J2SDK1.4(它具有内置的 JSSE 和 JNDI 支持),请确保客户机的类路径中有以下 Jar 文件:
  2. jsse.jar、jnet.jar、jcert.jar 和 jndi.jar

  3. 请确保客户机的类路径中有以下 MQ Jar 文件:
  4. imq.jar 和 jms.jar

  5. 启动客户机并连接到代理的 ssljms 服务。执行上述操作的方法之一是输入如下命令:
  6. java -DimqConnectionType=TLS clientAppName

    设置 imqConnectionType,通知连接使用 SSL。

    有关在客户机应用程序中使用 ssljms 连接服务的详细信息,请参阅《MQ 开发者指南》中有关使用被管理对象的章节。

命令行实用程序 (imqcmd)

您可以通过在使用 imqcmd 时包含 -secure 选项来建立一个安全管理连接(请参阅表 6-2),例如:

imqcmd list svc -b hostName:port -u adminName -p adminPassword -secure

其中 adminNameadminPassword 是 MQ 用户系统信息库中的有效条目(如果使用文本文件系统信息库,请参阅更改默认的管理员密码)。

列出连接服务(如本实例所示)是查看 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.

设置通过 HTTP 的 SSL 服务

在这种基于 SSL 的连接服务 (httpsjms) 中,客户机和代理通过 HTTPS 隧道 Servlet 建立安全连接。有关 HTTPS 支持所需的体系结构以及实现方法,请参阅附录 B“HTTP/HTTPS 支持(企业版)”

使用密码文件

如果您不希望代理启动时提示您输入密码,或者要求您作为 imqbrokerd 命令选项提供密码,您可以将所需的密码放在密码文件中。

密码文件是包含密码的纯文本文件。该文件没有加密,因此没有手动提供密码安全。但您可以为该文件设置权限,限制哪些用户可以查看它。密码文件的权限需要提供给启动代理权限并需要读取该文件的用户。

表 8-9 列出了密码文件可能包含的密码:

表 8-9    密码文件中的密码

密码

说明

imq.keystore.password
 

为基于 SSL 的服务指定键存储密码。

 
imq.user_repository.ldap.
password

 

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

 
imq.persist.jdbc.password
 

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

 

实例密码文件可以从以下位置找到:

IMQ_HOME/etc/passfile.sample(在 Solaris 操作系统上为 /etc/imq/passfile.sample


上一个      目录      索引      下一个     
版权所有 2002 Sun Microsystems, Inc.。保留所有权利。


部件号 817-5020-10