上一章 目录 索引 下一章 |
Sun Java System Message Queue 3.5 SP1 管理指南

> ## 附录 C
> HTTP/HTTPS 支持（企业版）

> Message Queue Enterprise Edition（请参见“产品版本”）包含对 HTTP 和 HTTPS 连接的支持。（HTTPS 传输连接使用安全套接字层 (SSL)，比 HTTP 连接更安全。）此支持使客户机应用程序可以使用 HTTP 协议（而不是直接 TCP 连接）与代理进行通信。本附录介绍了实现此支持所使用的体系结构，并说明了如何设置客户机，使之能够使用基于 HTTP 的连接进行 Message Queue 消息传送。

> 注意 | HTTP/HTTPS 支持可用于 Java 客户机，但不能用于 C 客户机。

> ##

> HTTP/HTTPS 支持体系结构

> 可以通过 HTTP/HTTPS 连接进行 Message Queue 消息传送。因为 HTTP/HTTPS 连接通常可以穿过防火墙，因此可以通过防火墙将客户机应用程序与代理隔开。

> 图 C-1 列出了提供 HTTP/HTTPS 支持所需的主要组件。

> - 在客户端，HTTP 或 HTTPS 传输驱动程序将 Message Queue 消息封装到 HTTP 请求中，并确保将这些请求以正确的顺序发送给 Web 服务器。
> - 必要时，客户机可以使用 HTTP 代理服务器与代理进行通信。可以在启动客户机时使用命令行选项指定代理地址。有关详细信息，请参见“使用 HTTP 代理”。
> - 将 JMS 消息转发给代理之前，需要将 HTTP 或 HTTPS 隧道 Servlet（均随 Message Queue 一起提供）装入 Web 服务器，并使用它们从客户机 HTTP 请求中提取 JMS 消息。HTTP/HTTPS 隧道 Servlet 还将代理消息发送回客户机，以响应客户机发出的 HTTP 请求。可以使用一个 HTTP/HTTPS 隧道 Servlet 访问多个代理。

> 图 C-1 HTTP/HTTPS 支持体系结构

> - 在代理端，httpjms 或 httpsjms 连接服务对来自相应隧道 Servlet 的消息进行展开和分离。
> - 如果 Web 服务器失败并重新启动，所有连接都将恢复且不会对客户机产生影响。如果代理失败并重新启动，将抛出异常，而客户机必须重新建立连接。如果 Web 服务器和代理同时失败（这种情况不太可能发生）而代理没有重新启动，Web 服务器将恢复客户机连接并等待代理恢复连接而不会通知客户机。要避免这种情况，请务必重新启动代理。

> 从图 C-1 可以看出，HTTP 和 HTTPS 支持所需的体系结构非常相似。主要区别在于，HTTPS（httpsjms 连接服务）中的隧道 Servlet 与客户机应用程序和代理之间的连接都是安全的。

> 与代理之间的安全连接是通过支持 SSL 的隧道 Servlet（Message Queue 的 HTTPS 隧道 Servlet）提供的，该 Servlet 会向请求连接的任何代理发送自签名证书。代理使用该证书建立与 HTTPS 隧道 Servlet 的加密连接。建立此连接后，客户机应用程序和 Web 服务器可以协商建立客户机应用程序和隧道 Servlet 之间的安全连接。

> ##

> 实现 HTTP 支持

> 以下各节介绍了实现 HTTP 支持所需执行的步骤。

> ##### 实现 HTTP 支持

> 1. 在 Web 服务器上部署 HTTP 隧道 Servlet。
> 2. 配置代理的 httpjms 连接服务并启动代理。
> 3. 配置 HTTP 连接。

> ### 步骤 1：在Web服务器上部署 HTTP 隧道 Servlet

> 在 Web 服务器上部署 HTTP 隧道 Servlet 的常见方法有两种：

> - 将其部署为支持 Servlet 2.1 或更早版本的 Web 服务器 Jar 文件
> - 将其部署为支持 Servlet 2.2 或更高版本的 Web 服务器 Web 归档 (WAR) 文件

> #### 部署为 Jar 文件

> 部署 Message Queue 隧道 Servlet 分为三个步骤，首先要使主机 Web 服务器可以访问相应的 Jar 文件，然后要对该 Web 服务器进行配置，使之在启动时装入该 Servlet，最后需要指定该 Servlet URL 的上下文根分区。

> 隧道 Servlet Jar 文件 (imqservlet.jar) 包含 HTTP 隧道 Servlet 所需的所有类，该文件所在的目录因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。

> 可以使用任何支持 Servlet 2.x 的 Web 服务器装入此 Servlet。Servlet 类名为：

> com.sun.messaging.jmq.transport.httptunnel.servlet.HttpTunnelServlet

> Web 服务器必须能够访问 imqservlet.jar 文件。如果计划在不同的主机上运行 Web 服务器和代理，应该在 Web 服务器能够访问的位置放置 imqservlet.jar 文件的一个副本。

> 还需要配置 Web 服务器以在启动时装入此 Servlet，可能需要指定该 Servlet URL 的上下文根分区（请参见“示例 1：在 Sun Java System Web Server 上部署 HTTP 隧道 Servlet”）。

> 同时建议您禁用 Web 服务器的访问日志功能以提高性能。

> #### 部署为 Web 归档文件

> 要将 HTTP 隧道 Servlet 部署为 WAR 文件，需要使用 Web 服务器提供的部署机制。HTTP 隧道 Servlet WAR 文件 (imqhttp.war) 所在的目录中包含 .jar、.war 和 .rar 文件，具体情况取决于您的操作系统（请参见附录 A“Message Queue 数据的位置”）。

> WAR 文件包含一个部署描述符，该描述符包含 Web 服务器装入和运行 Servlet 所需的基本配置信息。根据 Web 服务器的不同，可能还需要指定该 Servlet URL 的上下文根分区（请参见“示例 2：在 Sun Java System Application Server 7.0 上部署 HTTP 隧道 Servlet”）。

> ### 步骤 2：配置 httpjms连接服务

> 默认情况下，未为代理激活 HTTP 支持，因此您需要重新配置代理以激活 httpjms 连接服务。重新配置后，可以按照“启动代理”中介绍的步骤启动代理。

> ##### 激活 httpjms 连接服务

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

> 实例配置文件存储在一个目录中，该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识（请参见附录 A“Message Queue 数据的位置”）：

> /instances/instanceName/props/config.properties

> 2. 将 httpjms 值添加到 imq.service.activelist 属性中：

> imq.service.activelist=jms,admin,httpjms

> 启动时，代理将在其主机上查找运行的 Web 服务器和 HTTP 隧道 Servlet。但是要访问远程隧道 Servlet，需要重新配置 servletHost 和 servletPort 连接服务属性。

> 还可以重新配置 pullPeriod 属性以提高性能。表 C-1 详细介绍了 httpjms 连接服务配置属性。

> 表 C-1 httpjms 连接服务属性

> 属性名称 | 说明
> --- | ---
> imq.httpjms.http.servletHost | 必要时可以更改此值，以指定运行 HTTP 隧道 Servlet 的主机的名称（主机名或 IP 地址）。（可以是远程主机或本地主机上的特定主机名。）默认值：localhost
> imq.httpjms.http.servletPort | 需要更改此值，以指定代理用于访问 HTTP 隧道 Servlet 的端口号。（如果更改了 Web 服务器上的默认端口，也必须对此属性做相应的更改。）默认值： 7675
> imq.httpjms.http.pullPeriod | 指定客户机运行时从代理提取消息的 HTTP 请求的时间间隔（以秒为单位）。（注意，该属性在代理上设置并传播到客户机运行时。）如果值为零或为负数，客户机将始终使一个 HTTP 请求处于待处理状态，这样可以随时尽快地提取消息。如果客户机的数量过多，会大量消耗 Web 服务器资源，可能导致服务器停止响应。在这种情况下，应将 pullPeriod 属性设置为正秒数。此属性设置客户机 HTTP 传输驱动程序在发出下一个提取请求之前等待的时间。将此属性设置为正值将以牺牲客户机响应时间为代价来保持 Web 服务器资源的可用性。默认值： -1
> imq.httpjms.http.connectionTimeout | 指定客户机运行时在抛出异常前等待 HTTP 隧道 Servlet 响应的时间（以秒为单位）。（注意，该属性在代理上设置并传播到客户机运行时。）该属性还指定代理在与 HTTP 隧道 Servlet 进行了通信后等待断开的时间。在这种情况下可能会超时，因为代理和隧道 Servlet 不知道客户机正在访问的 HTTP Servlet是否已经异常终止。默认值： 60

> ### 步骤 3：配置 HTTP 连接

> 客户机应用程序必须使用正确配置的连接工厂管理对象，建立与代理之间的 HTTP 连接。本节介绍 HTTP 连接配置问题。

> #### 配置连接工厂

> 要实现 HTTP 支持，需要将连接工厂的 imqAddressList 属性设置为 HTTP 隧道 Servlet URL。HTTP 隧道 Servlet URL 的一般语法如下：

> http://hostName:port/contextRoot/tunnel

> 其中，hostName:port 是作为 HTTP 隧道 Servlet 宿主的 Web 服务器的名称和端口，contextRoot 是在该 Web 服务器上部署隧道 Servlet 时设置的路径。

> 通常有关连接工厂属性，特别是有关 imqAddressList 属性的详细信息，请参见《Message Queue Java Client Developer's Guide》。

> 可以按照以下方法之一设置连接工厂属性：

> - 在创建连接工厂管理对象（请参见“添加连接工厂”）的 imqobjmgr 命令中使用 -o 选项，或在使用管理控制台 (imqadmin) 创建连接工厂管理对象时设置属性。
> - 在启动客户机的命令中使用 -D 选项（请参见《Message Queue Java Client Developer's Guide》）。
> - 通过编程方式在客户机代码中创建连接工厂（请参见《Message Queue Java Client Developer's Guide》）之后，使用 API 调用设置其属性。

> #### 使用一个 Servlet 访问多个代理

> 即使正在运行多个代理，也无需配置多个 Web 服务器和多个 Servlet 实例。可以在并行运行的多个代理之间共享一个 Web 服务器和一个 HTTP 隧道 Servlet 实例。如果多个代理实例在共享一个隧道 Servlet，必须配置 imqAddressList 连接工厂属性，如下所示：

> http://hostName:port/contextRoot/tunnel?ServerName=bkrHostName:instanceName

> 其中，bkrHostName 是代理实例主机名，instanceName 是您希望客户机访问的特定代理实例的名称。

> 要查看是否输入了正确的 bkrHostName 和 bkrHostName 字符串，可以通过浏览器访问 Servlet URL，生成 HTTP 隧道 Servlet 的状态报告。状态报告将列出 Servlet 正在访问的所有代理：

> HTTP tunnel servlet ready. Servlet Start Time :Thu May 30 01:08:18 PDT 2002 Accepting TCP connections from brokers on port : 7675 Total available brokers = 2 Broker List : jpgserv:broker2 cochin:broker1

> #### 使用 HTTP 代理

> 如果使用 HTTP 代理访问 HTTP 隧道 Servlet：

> - 将 http.proxyHost 系统属性设置为代理服务器主机名。
> - 将 http.proxyPort 系统属性设置为代理服务器端口号。

> 可以通过在启动客户机应用程序的命令中使用 -D 选项来设置这些属性。

> ### 示例 1：在 Sun Java System Web Server 上部署 HTTP 隧道 Servlet

> 本节说明如何在 Sun Java System Web Server 上将 HTTP 隧道 Servlet 部署为 Jar 文件和 WAR 文件。使用的方法取决于 Sun Java System Web Server 的版本：如果 Sun ONE Web Server 不支持 Servlet 2.2 或更高版本，则不能处理 WAR 文件部署。

> #### 部署为 Jar 文件

> 下面的说明适用于使用基于浏览器的管理 GUI 在 Sun Java System Web Server 6.1 上部署 HTTP 隧道 Servlet 的情况。此过程包含以下通用步骤：

> 1. 添加 Servlet
> 2. 配置 Servlet 虚拟路径
> 3. 装入 Servlet
> 4. 禁用 Servlet 访问日志

> 以下小节对这些步骤进行了说明。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTP 隧道 Servlet。它应该显示状态信息。

> ##### 添加 Servlet

> ##### 添加隧道 Servlet

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Servlet Attribute”。
> 3. 在“Servlet Name”字段中指定隧道“Servlet”的名称。
> 4. 将“Servlet Code”（类名）字段设置为以下值：

> com.sun.messaging.jmq.transport.httptunnel.servlet.HttpTunnelServlet

> 5. 在“Servlet Classpath”字段中输入 imqservlet.jar 的完整路径。例如：

> /usr/share/lib/imq/imqservlet.jar（在 Solaris 操作系统上）

> /opt/imq/lib/imqservlet.jar（在 Linux 操作系统上）

> IMQ_HOME/lib/imqservlet.jar（在 Windows 操作系统上）

> 6. 在“Servlet args”字段中输入可选参数，如表 C-2 所示：

> 表 C-2 用于部署 HTTP 隧道 Servlet Jar 文件的 Servlet 参数

> 参数 | 默认值 | 参考
> --- | --- | ---
> servletHost | 所有主机 | 请参见表 C-1
> servletPort | 7675 | 请参见表 C-1

> 如果使用两个参数，请使用逗号分隔：

> servletPort=portNumber, servletHost=

> servletHost 和 servletPort 参数仅应用于 Web 服务器和代理之间的通信，仅当默认值存在问题时才需要进行设置。但是，在这种情况下，还必须相应地设置代理配置属性（请参见表 C-1），例如：

> imq.httpjms.http.servletPort

> ##### 配置 Servlet 虚拟路径 (Servlet URL)

> ##### 配置隧道 Servlet 的虚拟路径 (Servlet URL)

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Servlet Virtual Path Translation”。
> 3. 设置“Virtual Path”字段。

> Virtual Path 是隧道 Servlet URL 的 /contextRoot/tunnel 分区：

> http://hostName:port/contextRoot/tunnel

> 例如，如果将 contextRoot 设置为 imq，则Virtual Path字段将为：

> /imq/tunnel

> 4. 设置“Servlet Name”字段的值，使之与“添加 Servlet”中的步骤 3 中设置的值相同。

> ##### 装入 Servlet

> ##### 在 Web 服务器启动时装入隧道 Servlet

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Global Attributes”。
> 3. 在“Startup Servlets”字段中，输入与“添加 Servlet”中的步骤 3 中的值相同的 Servlet 名称值。

> ##### 禁用服务器访问日志

> 不是必须禁用服务器访问日志，但禁用服务器访问日志可以获得更佳的性能。

> ##### 禁用服务器访问日志

> 1. 选择“Status”选项卡。
> 2. 选择“Log Preferences Page”。
> 3. 使用“Log”客户机访问控制禁用日志。

> #### 部署为 WAR 文件

> 下面的说明适用于在 Sun Java System Web Server 6.0 Service 上的部署。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTP 隧道 Servlet。它应该显示状态信息。

> ##### 将 HTTP 隧道 Servlet 部署为 WAR 文件

> 1. 在基于浏览器的管理 GUI 中，选择“Virtual Server Class”选项卡并选择“Manage Classes”。
> 2. 选择相应的虚拟服务器类名（例如，defaultClass）并单击“Manage”按钮。
> 3. 选择“Manage Virtual Servers”。
> 4. 选择相应的虚拟服务器名称并单击“Manage”按钮。
> 5. 选择“Web Applications”选项卡。
> 6. 单击“Deploy Web Application”。
> 7. 为“WAR File On”和“WAR File Path”字段选择相应的值，以指向 imqhttp.war 文件，该文件所在的目录因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。
> 8. 在“Application URI”字段中输入路径。

> “Application URI”字段值为隧道 Servlet URL 的 /contextRoot 分区：

> http://hostName:port/contextRoot/tunnel

> 例如，如果将 contextRoot 设置为 imq，则“Application URI”字段将为：

> /imq

> 9. 输入要在其中部署 Servlet 的安装目录路径（通常位于 Sun Java System Web Server 的安装根目录下）。
> 10. 单击“OK”。
> 11. 重新启动 Web 服务器实例。

> Servlet 现在即被部署到以下位置：

> http://hostName:port/contextRoot/tunnel

> 客户机现在即可使用此 URL 连接至使用 HTTP 连接的消息服务。

> ### 示例 2：在 Sun Java System Application Server 7.0 上部署 HTTP 隧道 Servlet

> 本节说明如何在 Sun Java System Application Server 7.0 上将 HTTP 隧道 Servlet 部署为 WAR 文件。

> 需要执行两个步骤：

> - 使用 Application Server 7.0 部署工具部署 HTTP 隧道 Servlet
> - 修改应用程序服务器实例的 server.policy 文件

> #### 使用部署工具

> ##### 在 Application Server 7.0 环境下部署 HTTP 隧道 Servlet

> 1. 在基于 Web 的管理 GUI 中，选择

> App ServerInstancesserver1ApplicationsWeb Applications。

> 2. 单击“Deploy”按钮。
> 3. 在“File Path:”文本字段中，输入 HTTP 隧道 Servlet WAR 文件 (imqhttp.war) 的位置。

> imqhttp.war 文件的位置因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。

> 4. 单击“OK”。
> 5. 在下一个屏幕上，为“Context Root”文本字段设置值。

> Context Root字段值为隧道 Servlet URL 的 /contextRoot 分区：

> http://hostName:port/contextRoot/tunnel

> 例如，可以将“Context Root”字段设置为：

> /imq

> 6. 单击“OK”。

> 下一个屏幕显示隧道 Servlet 已成功部署，默认情况下处于启用状态，在这种情况下，它位于以下位置：

> /var/opt/SUNWappserver7/domains/domain1/server1/applications/j2ee-modules/imqhttp_1

> Servlet 现在即被部署到以下位置：

> http://hostName:port/contextRoot/tunnel

> 客户机现在即可使用此 URL 连接至使用 HTTP 连接的消息服务。

> #### 修改 server.policy 文件

> Application Server 7.0 实施了一套默认的安全策略，除非经过修改，否则它们将阻止 HTTP 隧道 Servlet 与 Message Queue 代理进行连接。

> 每个应用程序服务器实例都有一个包含其安全策略或规则的文件。例如，Solaris 上 server1 实例的此文件的位置为：

> /var/opt/SUNWappserver7/domains/domain1/server1/config/server.policy

> 要使隧道 Servlet 与 Message Queue 代理进行连接，此文件中还必须有另外一个条目。

> ##### 修改 Application Server 的 server.policy 文件

> 1. 打开 server.policy 文件。
> 2. 添加以下条目：

> grant codeBase
> "file:/var/opt/SUNWappserver7/domains/domain1/server1/ applications/j2ee-modules/imqhttp_1/-"
> {
> permission java.net.SocketPermission "*", "connect,accept,resolve";
> };

> ##

> 实现 HTTPS 支持

> 以下各节介绍了实现 HTTPS 支持所需执行的步骤。所需操作与“实现 HTTP 支持”中的操作类似，只是增加了生成和访问 SSL 证书的步骤。

> ##### 实现 HTTPS 支持

> 1. 为 HTTPS 隧道 Servlet 生成自签名证书。
> 2. 在 Web 服务器上部署 HTTPS 隧道 Servlet。
> 3. 配置代理的 httpsjms 连接服务并启动代理。
> 4. 配置 HTTPS 连接。

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

> ### 步骤 1：为 HTTPS 隧道 Servlet 生成自签名证书

> Message Queue 的 SSL 支持用于保护所传输数据的安全，假定客户机正在与已知且可信任的服务器进行通信。因此，仅使用自签名的服务器证书实现 SSL。在 httpsjms 连接服务体系结构中，HTTPS 隧道 Servlet 充当代理和应用程序客户机的服务器。

> 运行 imqkeytool 实用程序，为隧道 Servlet 生成自签名证书。在命令提示符下输入以下内容：

> imqkeytool -servlet keystore_location

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

> 首先，imqkeytool 提示您输入键值存储密码，然后提示您输入组织信息，最后提示您进行确认。收到确认后，它将在生成密钥对时暂停。然后它要求您输入密码以锁定特定密钥对（密钥密码），此时请按回车键响应此提示：这将使密钥密码与键值存储密码相同。

> 注意 | 请记住您输入的密码，稍后需要将此密码提供给隧道 Servlet 使其能够打开键值存储。

> 运行 imqkeytool 命令以运行 JDK keytool 实用程序，生成自签名证书并将其放置在 Message Queue 的键值存储文件中，该文件的位置由 keystore_location 参数指定。（键值存储格式与 JDK1.2 keytool 支持的键值存储格式相同。）

> 注意 | HTTPS 隧道 Servlet 必须可以访问该键值存储。确保将 keystore_location 中已生成的键值存储移动/复制到 HTTPS 隧道 Servlet 可以访问的位置（请参见“步骤 2：在 Web服务器上部署 HTTPS 隧道 Servlet”）。

> ### 步骤 2：在 Web服务器上部署 HTTPS 隧道 Servlet

> 在 Web 服务器上部署 HTTPS 隧道 Servlet 的常见方法有两种：

> - 将其部署为支持 Servlet 2.1 或更早版本的 Web 服务器 Jar 文件
> - 将其部署为支持 Servlet 2.2 或更高版本的 Web 服务器 Web 归档 (WAR) 文件

> 在任一种情况下，都应确保激活 Web 服务器的加密功能，确保客户机与代理之间的端到端通信是安全的。

> #### 部署为 Jar 文件

> 部署 Message Queue 隧道 Servlet 分为三个步骤，首先要使主机 Web 服务器可以访问相应的 Jar 文件，然后要对该 Web 服务器进行配置，使之在启动时装入该 Servlet，最后需要指定该 Servlet URL 的上下文根分区。

> 隧道 Servlet Jar 文件 (imqservlet.jar) 包含 HTTPS 隧道 Servlet 所需的所有类，该文件所在的目录因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。

> 可以使用任何支持 Servlet 2.x 的 Web 服务器装入此 Servlet。Servlet 类名为：

> com.sun.messaging.jmq.transport.httptunnel.servlet.HttpsTunnelServlet

> Web 服务器必须能够访问 imqservlet.jar 文件。如果计划在不同的主机上运行 Web 服务器和代理，应该在 Web 服务器能够访问的位置放置 imqservlet.jar 文件的一个副本。

> 还需要配置 Web 服务器以在启动时装入此 Servlet，可能需要指定该 Servlet URL 的上下文根分区（请参见“示例 3：在 Sun Java System Web Server 上部署 HTTPS 隧道 Servlet”）。

> 确保 JSSE Jar 文件位于 Web 服务器上运行 Servlets 的类路径中。请参阅 Web 服务器文档，了解如何执行此操作。

> 配置 Web 服务器有一个重要的方面，即指定 HTTPS 隧道 Servlet 用来与代理建立安全连接所需的自签名证书的位置和密码。必须将您在“步骤 1：为 HTTPS 隧道 Servlet 生成自签名证书”中创建的键值存储放置在 HTTPS 隧道 Servlet 可以访问的位置。

> 同时建议您禁用 Web 服务器的访问日志功能以提高性能。

> #### 部署为 Web 归档文件

> 要将 HTTPS 隧道 Servlet 部署为 WAR 文件，需要使用 Web 服务器提供的部署机制。HTTPS 隧道 Servlet WAR 文件 (imqhttps.war) 所在的目录因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。

> WAR 文件包含一个部署描述符，该描述符包含 Web 服务器装入和运行 Servlet 所需的基本配置信息。根据 Web 服务器的不同，可能还需要指定该 Servlet URL 的上下文根分区（请参见“示例 4：在 Sun Java System Application Server 7.0 上部署 HTTPS 隧道 Servlet”）。

> 但是，imqhttps.war 文件的部署描述符无法知道您放置隧道 Servlet 所需的键值存储的位置（请参见“步骤 1：为 HTTPS 隧道 Servlet 生成自签名证书”）。因此您需要在部署 imqhttps.war 文件之前编辑隧道 Servlet 部署描述符（一个 XML 文件），以指定键值存储的位置。

> ### 步骤 3：配置httpsjms 连接服务

> 默认情况下，未为代理激活 HTTPS 支持，因此您需要重新配置代理以激活 httpsjms 连接服务。重新配置后，可以按照“启动代理”中介绍的步骤启动代理。

> ##### 激活 httpsjms 连接服务

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

> 实例配置文件存储在一个目录中，该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识（请参见附录 A“Message Queue 数据的位置”）：

> /instances/instanceName/props/config.properties

> 2. 将 httpsjms 值添加到 imq.service.activelist 属性中：

> imq.service.activelist=jms,admin,httpsjms

> 启动时，代理将在其主机上查找运行的 Web 服务器和 HTTPS 隧道 Servlet。但是要访问远程隧道 Servlet，需要重新配置 servletHost 和 servletPort 连接服务属性。

> 还可以重新配置 pullPeriod 属性以提高性能。表 C-3 详细介绍了 httpsjms 连接服务配置属性。

> 表 C-3 httpsjms 连接服务属性

> 属性名称 | 说明
> --- | ---
> imq.httpsjms.https.servletHost | 必要时可以更改此值，以指定运行 HTTPS 隧道 Servlet 的主机的名称（主机名或 IP 地址）。（可以是远程主机或本地主机上的特定主机名。）默认值：localhost
> imq.httpsjms.https.servletPort | 需要更改此值，以指定代理用于访问 HTTPS 隧道 Servlet 的端口号。（如果更改了 Web 服务器上的默认端口，也必须对此属性做相应的更改。）默认值： 7674
> imq.httpsjms.https.pullPeriod | 指定每一台客户机创建从代理提取消息的 HTTP 请求的时间间隔（以秒为单位）。（注意，该属性在代理上设置并传播到客户机运行时。）如果值为零或为负数，客户机将始终使一个 HTTP 请求处于待处理状态，这样可以随时尽快地提取消息。如果客户机的数量过多，会大量消耗 Web 服务器资源，可能导致服务器停止响应。在这种情况下，应将 pullPeriod 属性设置为正秒数。此属性设置客户机 HTTP 传输驱动程序在发出下一个提取请求之前等待的时间。将此属性设置为正值将以牺牲客户机响应时间为代价来保持 Web 服务器资源的可用性。默认值： -1
> imq.httpsjms.https.connectionTimeout | 指定客户机运行时在抛出异常前等待 HTTPS 隧道 Servlet 响应的时间（以秒为单位）（注意，该属性在代理上设置并传播到客户机运行时。）该属性还指定代理在与 HTTPS 隧道 Servlet 进行了通信后等待断开的时间。在这种情况下可能会超时，因为代理和隧道 Servlet 不知道客户机正在访问的 HTTPS Servlet是否已经异常终止。默认值： 60

> ### 步骤 4：配置 HTTPS 连接

> 客户机应用程序必须使用正确配置的连接工厂管理对象，建立与代理之间的 HTTPS 连接。

> 但是，客户机还必须能够访问 Java 安全套接扩展 (JSSE) 提供的 SSL 库，并且必须具有一个根证书。SSL 库是随 JDK 1.4 一起提供的。如果您使用的是早期版本的 JDK，请参见“配置 JSSE”；否则，请转至“输入根证书”

> 解决上述问题后，可以继续配置 HTTPS 连接。

> #### 配置 JSSE

> 1. 将 JSSE Jar 文件复制到 JRE_HOME/lib/ext 目录中。

> 包括 jsse.jar、jnet.jar 和 jcert.jar

> 2. 通过添加以下内容来静态添加 JSSE 安全服务供应商：

> security.provider.n=com.sun.net.ssl.internal.ssl.Provider

> 将这些内容添加到 JRE_HOME/lib/security/java.security 文件中，（其中 n 是安全服务供应商软件包的下一个可用优先编号）。

> 3. 如果使用的不是 JDK1.4，则需要在启动客户机应用程序的命令中使用 -D 选项，以设置下列 JSSE 属性：

> java.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol

> #### 输入根证书

> 如果默认情况下签署您的 Web 服务器证书的 CA 的根用户证书不在信任数据库中，或者使用的是专用 Web 服务器证书，则必须将该证书添加到信任数据库中。如果出现上述情况，请执行以下操作；否则，请转至“配置连接工厂”。

> 如果证书保存在 cert_file 中，而您的键值存储为 trust_store_file，请运行以下命令：

> JRE_HOME/bin/keytool -import -trustcacerts -alias alias_for_certificate -file cert_file -keystore trust_store_file

> 显示以下问题时请选择 YES：Trust this certificate?

> 还需要在启动客户机应用程序的命令中使用 -D 选项，以指定下列 JSSE 属性：

> javax.net.ssl.trustStore=trust_store_file

> javax.net.ssl.trustStorePassword=trust_store_passwd

> #### 配置连接工厂

> 要实现 HTTPS 支持，需要将连接工厂的 imqAddressList 属性设置为 HTTPS 隧道 Servlet URL。HTTPS 隧道 Servlet URL 的一般语法如下：

> https://hostName:port/contextRoot/tunnel

> 其中，hostName:port 作为 HTTPS 隧道 Servlet 宿主的 Web 服务器的名称和端口，contextRoot 是在该 Web 服务器上部署隧道 Servlet 时设置的路径。

> 通常有关连接工厂属性，特别是有关 imqAddressList 属性的详细信息，请参见《Message Queue Java Client Developer's Guide》。

> 可以按照以下方法之一设置连接工厂属性：

> - 在创建连接工厂管理对象（请参见“添加连接工厂”）的 imqobjmgr 命令中使用 -o 选项，或在使用管理控制台 (imqadmin) 创建连接工厂管理对象时设置属性。
> - 在启动客户机应用程序的命令中使用 -D 选项（请参见《Message Queue Java Client Developer's Guide》）。
> - 通过编程方式在客户机应用程序代码中创建连接工厂（请参见《Message Queue Java Client Developer's Guide》）之后，使用 API 调用设置其属性。

> #### 使用一个 Servlet 访问多个代理

> 即使正在运行多个代理，也无需配置多个 Web 服务器和多个 Servlet 实例。可以在并行运行的多个代理之间共享一个 Web 服务器和一个 HTTPS 隧道 Servlet 实例。如果多个代理实例共享一个隧道 Servlet，则必须配置 imqAddressList 连接工厂属性，如下所示：

> https://hostName:port/contextRoot/tunnel?ServerName=bkrHostName:instanceName

> 其中，bkrHostName 是代理实例主机名，instanceName 是您希望客户机访问的特定代理实例的名称。

> 要查看是否输入了正确的 bkrhostName 和 instanceName 字符串，可以通过浏览器访问 Servlet URL，生成 HTTPS 隧道 Servlet 的状态报告。状态报告将列出 Servlet 正在访问的所有代理：

> HTTPS tunnel servlet ready. Servlet Start Time : Thu May 30 01:08:18 PDT 2002 Accepting secured connections from brokers on port : 7674 Total available brokers = 2 Broker List : jpgserv:broker2 cochin:broker1

> #### 使用 HTTP 代理

> 如果使用 HTTP 代理访问 HTTPS 隧道 Servlet：

> - 将 http.proxyHost 系统属性设置为代理服务器主机名。
> - 将 http.proxyPort 系统属性设置为代理服务器端口号。

> 可以通过在启动客户机应用程序的命令中使用 -D 选项来设置这些属性。

> ### 示例 3：在 Sun Java System Web Server 上部署 HTTPS 隧道 Servlet

> 本节说明如何在 Sun Java System Web Server 上将 HTTPS 隧道 Servlet 部署为 Jar 文件和 WAR 文件。使用的方法取决于 Sun Java System Web Server 的版本：如果 Sun ONE Web Server 不支持 Servlet 2.2 或更高版本，则不能处理 WAR 文件部署。

> #### 部署为 Jar 文件

> 以下说明适用于使用基于浏览器的管理 GUI 在 Sun Java System Web Server 6.1 上部署 HTTP 隧道 Servlet 的情况。此过程包含以下通用步骤：

> 1. 添加 Servlet
> 2. 配置 Servlet 虚拟路径
> 3. 装入 Servlet
> 4. 禁用 Servlet 访问日志

> 在以下小节中，对这些步骤进行了说明。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTPS 隧道 Servlet。它应该显示状态信息。

> ##### 添加 Servlet

> ##### 添加隧道 Servlet

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Servlet Attribute”。
> 3. 在“Servlet Name”字段中指定隧道 Servlet 的名称。
> 4. 将“Servlet Code”（类名）字段设置为以下值：

> com.sun.messaging.jmq.transport.httptunnel.servlet.HttpsTunnelServlet

> 5. 在“Servlet Classpath”字段中输入 imqservlet.jar 的完整路径。例如：

> /usr/share/lib/imq/imqservlet.jar（在 Solaris 操作系统上）

> /opt/imq/lib/imqservlet.jar（在 Linux 操作系统上）

> IMQ_HOME/lib/imqservlet.jar（在 Windows 操作系统上）

> 6. 在“Servlet args”字段中输入必需参数和可选参数，如表 C-4 所示。

> 表 C-4 用于部署 HTTPS 隧道 Servlet Jar 文件的 Servlet 参数

> 参数 | 默认值 | 是否必需？ | 另请参见
> --- | --- | --- | ---
> keystoreLocation | 无 | 是 | 表 8-8
> keystorePassword | 无 | 是 | 表 8-8
> servletHost | 所有主机 | 无 | 表 C-3
> servletPort | 7674 | 无 | 表 C-3

> 参数之间用逗号分隔，例如：

> keystoreLocation=keystore_location,keystorePassword=keystore_password, servletPort=portnumber

> servletHost 和 servletPort 参数仅应用于 Web 服务器和代理之间的通信，仅当默认值存在问题时才需要进行设置。但是，在这种情况下，还必须相应地设置代理配置属性（请参见表 C-3），例如：

> imq.httpsjms.https.servletPort

> ##### 配置 Servlet 虚拟路径 (Servlet URL)

> ##### 配置隧道 Servlet 的虚拟路径 (Servlet URL)

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Servlet Virtual Path Translation”。
> 3. 设置“Virtual Path”字段。

> Virtual Path 是隧道 Servlet URL 的 /contextRoot/tunnel 分区：

> https://hostName:port/contextRoot/tunnel

> 例如，如果将 contextRoot 设置为 imq，则“Virtual Path”字段将为：

> /imq/tunnel

> 4. 设置“Servlet Name”字段的值，使之与“添加 Servlet中的步骤 3 中设置的值相同。

> ##### 装入 Servlet

> ##### 在 Web 服务器启动时装入隧道 Servlet

> 1. 选择“Servlets”选项卡。
> 2. 选择“Configure Global Attributes”。
> 3. 在“Startup Servlets”字段中，输入与“添加 Servlet”中的步骤 3 中的值相同的 Servlet 名称值。

> ##### 禁用服务器访问日志

> 不是必须禁用服务器访问日志，但禁用服务器访问日志可以获得更佳的性能。

> ##### 禁用服务器访问日志

> 1. 选择“Status”选项卡。
> 2. 选择“Log Preferences Page”。
> 3. 使用“Log”客户机访问控制禁用日志。

> #### 部署为 WAR 文件

> 以下说明是指对 Sun Java System Web Server 6.0 Service Pack 2 部署的说明。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTPS 隧道 Servlet。它应该显示状态信息。

> 部署 HTTPS 隧道 Servlet 之前，请确保 JSSE Jar 文件位于 Web 服务器的类路径中。要达到此目的，最简单的方法是将 jsse.jar、jnet.jar 和 jcert.jar 文件复制到 IWS60_TOPDIR/bin/https/jre/lib/ext 中。

> 另外，部署 HTTPS 隧道 Servlet 之前，必须指定键值存储密码并修改部署描述符，使其指向放置键值存储文件的位置。

> ##### 修改 HTTPS 隧道 Servlet WAR 文件

> 1. 将 WAR 文件复制到临时目录中。

> cp /usr/share/lib/imq/imqhttps.war /tmp（在 Solaris 操作系统上）

> cp /opt/imq/lib/imqhttps.war /tmp（在 Linux 操作系统上）

> cp IMQ_HOME/lib/imqhttps.war /tmp（在 Windows 操作系统上）

> 2. 使临时目录成为当前目录。

> $ cd /tmp

> 3. 提取 WAR 文件的内容。

> $ jar xvf imqhttps.war

> 4. 列出 WAR 文件的部署描述符。

> $ ls -l WEB-INF/web.xml

> 5. 编辑 web.xml 文件，以提供正确的 keystoreLocation 和 keystorePassword 参数值（如有必要，还包括 servletPort 和 servletHost 参数）。
> 6. 重新装入 WAR 文件的内容。

> $ jar uvf imqhttps.war WEB-INF/web.xml

> 现在即可使用这个修改后的 imqhttps.war 文件部署 HTTPS 隧道 Servlet 了。（如果担心会泄漏键值存储密码，可以使用文件系统权限限制对 imqhttps.war 文件的访问。）

> ##### 将 HTTPS 隧道 Servlet 部署为 WAR 文件

> 1. 在基于浏览器的管理 GUI 中，选择“Virtual Server Class”选项卡。单击“Manage Classes”。
> 2. 选择相应的虚拟服务器类名（例如，defaultClass）并单击“Manage”按钮。
> 3. 选择“Manage Virtual Servers”。
> 4. 选择相应的虚拟服务器名称并单击“Manage”按钮。
> 5. 选择“Web Applications”选项卡。
> 6. 单击“Deploy Web Application”。
> 7. 为“WAR File On”和“WAR File Path”字段选择相应的值，以指向修改后的 imqhttps.war 文件（请参见修改 HTTPS 隧道 Servlet WAR 文件）。
> 8. 在“Application URI”字段中输入路径。

> “Application URI”字段值为隧道 Servlet URL 的 /contextRoot 分区：

> https://hostName:port/contextRoot/tunnel

> 例如，如果将 contextRoot 设置为 imq，则“Application URI”字段将为：

> /imq

> 9. 输入要在其中部署 Servlet 的安装目录路径（通常位于 Sun Java System Web Server 的安装根目录下）。
> 10. 单击“OK”。
> 11. 重新启动 Web 服务器实例。

> Servlet 现在即被部署到以下位置：

> https://hostName:port/imq/tunnel

> 客户机现在即可使用此 URL 连接至使用安全 HTTPS 连接的消息服务。

> ### 示例 4：在 Sun Java System Application Server 7.0 上部署 HTTPS 隧道 Servlet

> 本节说明如何在 Sun Java System Application Server 7.0 上将 HTTPS 隧道 Servlet 部署为 WAR 文件。

> 需要执行两个步骤：

> - 使用 Application Server 7.0 部署工具部署 HTTPS 隧道 Servlet
> - 修改应用程序服务器实例的 server.policy 文件

> #### 使用部署工具

> ##### 在 Application Server 7.0 环境下部署 HTTPS 隧道 Servlet

> 1. 在基于 Web 的管理 GUI 中，选择

> App ServerInstancesserver1ApplicationsWeb Applications。

> 2. 单击“Deploy”按钮。
> 3. 在“File Path:”文本字段中，输入 HTTPS 隧道 Servlet WAR 文件 (imqhttps.war) 的位置。

> imqhttps.war 文件的位置因操作系统而异（请参见附录 A“Message Queue 数据的位置”）。

> 4. 单击“OK”。
> 5. 在下一个屏幕上，为“Context Root”文本字段设置值。

> “Context Root”字段值为隧道 Servlet URL 的 /contextRoot 分区：

> https://hostName:port/contextRoot/tunnel

> 例如，可以将“Context Root”字段设置为：

> /imq

> 6. 单击“OK”。

> 下一个屏幕显示隧道 Servlet 已成功部署，默认情况下处于启用状态，在这种情况下，它位于以下位置：

> /var/opt/SUNWappserver7/domains/domain1/server1/applications/j2ee-modules/imqhttps_1

> Servlet 现在即被部署到以下位置：

> https://hostName:port/contextRoot/tunnel

> 客户机现在即可使用此 URL 连接至使用 HTTPS 连接的消息服务。

> #### 修改 server.policy 文件

> Application Server 7.0 实施了一套默认的安全策略，除非经过修改，否则它们将阻止 HTTPS 隧道 Servlet 与 Message Queue 代理进行连接。

> 每个应用程序服务器实例都有一个包含其安全策略或规则的文件。例如，Solaris 上 server1 实例的此文件的位置为：

> /var/opt/SUNWappserver7/domains/domain1/server1/config/server.policy

> 要使隧道 Servlet 与 Message Queue 代理进行连接，此文件中还必须有另外一个条目。

> ##### 修改 Application Server 的 server.policy 文件

> 1. 打开 server.policy 文件。
> 2. 添加以下条目：

> grant codeBase
> "file:/var/opt/SUNWappserver7/domains/domain1/server1/ applications/j2ee-modules/imqhttps_1/-"
> {
> permission java.net.SocketPermission "*", "connect,accept,resolve";
> };

> 上一章 目录 索引 下一章

> 版权所有 2004 Sun Microsystems, Inc. 保留所有权利。