![]() | |
Sun Java System Message Queue 3 2005Q1 管理指南 |
附录 C
HTTP/HTTPS 支持Message Queue Enterprise Edition 支持 Java 客户机通过 HTTP 或安全 HTTP (HTTPS) 传输与代理通信,而不是通过直接 TCP 连接。HTTP/HTTPS 支持不适用于 C 客户机。
本附录介绍了实现此支持所使用的体系结构,并说明了如何设置客户机,使之能够使用基于 HTTP 的连接进行 Message Queue 消息传送。其中包含以下各节:
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
在 Web 服务器上部署 HTTP 隧道 Servlet 的常见方法有两种:
部署为 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.HttpTunnelServletWeb 服务器必须能够访问 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 连接服务
- 打开代理的实例配置文件。
实例配置文件存储在一个目录中,该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识(请参见附录 A“Message Queue 数据在特定操作系统中的位置”):
…/instances/instanceName/props/config.properties
- 将 httpjms 值添加到 imq.service.activelist 属性中:
imq.service.activelist=jms,admin,httpjms
启动时,代理将在其主机上查找运行的 Web 服务器和 HTTP 隧道 Servlet。但是要访问远程隧道 Servlet,需要重新配置 servletHost 和 servletPort 连接服务属性。
还可以重新配置 pullPeriod 属性以提高性能。表 C-1 详细介绍了 httpjms 连接服务配置属性。
步骤 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 Developer's Guide for Java Clients。
可以按照以下方法之一设置连接工厂属性:
- 在创建连接工厂管理对象(请参见添加连接工厂)的 imqobjmgr 命令中使用 -o 选项,或在使用管理控制台 (imqadmin) 创建连接工厂管理对象时设置属性。
- 在启动客户机的命令中使用 -D 选项(请参见 Message Queue Developer's Guide for Java Clients )。
- 通过编程方式在客户机代码中创建连接工厂(请参见 Message Queue Developer's Guide for Java Clients)之后,使用 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 隧道 servlet 就绪。
Servlet 开始时间:Thu May 30 01:08:18 PDT 2002
接受端口上来自代理的 TCP 连接: 7675
可用代理总数 = 2
代理列表:
jpgserv:broker2
cochin:broker1
使用 HTTP 代理
如果使用 HTTP 代理访问 HTTP 隧道 Servlet:
可以通过在启动客户机应用程序的命令中使用 -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 的情况。此过程包含以下通用步骤:
在以下小节中,对这些步骤进行了说明。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTP 隧道 Servlet。它应该显示状态信息。
添加 Servlet
添加隧道 Servlet
- 选择 "Servlets" 选项卡。
- 选择“配置 Servlet 属性”。
- 在“Servlet 名称”字段中指定隧道 Servlet 的名称。
- 将“Servlet 代码”(类名)字段设置为以下值:
com.sun.messaging.jmq.transport.httptunnel.servlet.HttpTunnelServlet
- 在“Servlet 类路径”字段中输入 imqservlet.jar 的完整路径。例如:
/usr/share/lib/imq/imqservlet.jar (Solaris)
/opt/sun/mq/share/lib/imqservlet.jar (Linux)
IMQ_HOME/lib/imqservlet.jar (Windows)- 在“Servlet 参数”字段中输入可选参数,如表 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)
- 选择 "Servlets" 选项卡。
- 选择“配置 Servlet 虚拟路径转换”。
- 设置“虚拟路径”字段。
“虚拟路径”是隧道 Servlet URL 的 /contextRoot/tunnel 分区:
http://hostName:port/contextRoot/tunnel
例如,如果将 contextRoot 设置为 imq,则“虚拟路径”字段将为:
/imq/tunnel
- 设置“Servlet 名称”字段的值,使之与添加 Servlet 中的步骤 3 中设置的值相同。
装入 Servlet
在 Web 服务器启动时装入隧道 Servlet
- 选择 "Servlets" 选项卡。
- 选择“配置全局属性”。
- 在“启动 Servlets”字段中,输入与添加 Servlet 中的步骤 3 中的值相同的 Servlet 名称值。
禁用服务器访问日志
不是必须禁用服务器访问日志,但禁用服务器访问日志可以获得更佳的性能。
禁用服务器访问日志部署为 WAR 文件
以下是对 Sun Java System Web Server 6.0 Service Pack 2 部署的说明。通过使用 Web 浏览器访问 Servlet URL,可以验证是否成功部署了 HTTP 隧道 Servlet。它应该显示状态信息。
将 HTTP 隧道 Servlet 部署为 WAR 文件
- 在基于浏览器的管理 GUI 中,选择“虚拟 Server 类”选项卡并选择“管理类”。
- 选择相应的虚拟服务器类名(例如,defaultClass)并单击“管理”按钮。
- 选择“管理虚拟服务器”。
- 选择相应的虚拟服务器名称并单击“管理”按钮。
- 选择“Web 应用程序”选项卡。
- 单击“部署 Web 应用程序”。
- 为“WAR 文件打开”和“WAR 文件路径”字段选择相应的值,以指向 imqhttp.war 文件,该文件所在的目录因操作系统而异(请参见附录 A“Message Queue 数据在特定操作系统中的位置”)。
- 在“应用程序 URI”字段中输入路径。
“应用程序 URI”字段值为隧道 Servlet URL 的 /contextRoot 分区:
http://hostName:port/contextRoot/tunnel
例如,如果将 contextRoot 设置为 imq,则“应用程序 URI”字段将为:
/imq
- 输入要在其中部署 Servlet 的安装目录路径(通常位于 Sun Java System Web Server 的安装根目录下)。
- 单击“确定”。
- 重新启动 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
- 在基于 Web 的管理 GUI 中,选择
“应用服务器”>“实例”>“服务器 1”>“应用程序”>“Web 应用程序”。
- 单击“部署”按钮。
- 在“文件路径:”文本字段中,输入 HTTP 隧道 Servlet WAR 文件 (imqhttp.war) 的位置。
imqhttp.war 文件的位置因操作系统而异(请参见附录 A“Message Queue 数据在特定操作系统中的位置”)
- 单击“确定”。
- 在下一个屏幕上,设置“上下文根”文本字段的值。
“上下文根”字段值为隧道 Servlet URL 的 /contextRoot 分区:
http://hostName:port/contextRoot/tunnel
例如,可以将“上下文根”字段设置为 /imq。
- 单击“确定”。
下一个屏幕显示隧道 Servlet 已成功部署,默认情况下处于启用状态,在这种情况下,它位于以下位置:
/var/opt/SUNWappserver7/domains/domain1/server1/applications/
j2ee-modules/imqhttp_1Servlet 现在即被部署到以下位置:
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 文件
实现 HTTPS 支持以下各节介绍了实现 HTTPS 支持所需执行的步骤。所需操作与实现 HTTP 支持中的操作类似,只是增加了生成和访问 SSL 证书的步骤。
实现 HTTPS 支持下文详细介绍了每个步骤。
步骤 1:为 HTTPS 隧道 Servlet 生成自签名证书
Message Queue 的 SSL 支持用于保护所传输数据的安全,假定客户机正在与已知且可信任的服务器进行通信。因此,仅使用自签名的服务器证书实现 SSL。在 httpsjms 连接服务体系结构中,HTTPS 隧道 Servlet 充当代理和应用程序客户机的服务器。
运行 imqkeytool 实用程序,为隧道 Servlet 生成自签名证书。在命令提示符下输入以下内容:
imqkeytool -servlet keystore_location
命令行实用程序会提示您提供所需的信息。(在 Unix 操作系统上,可能需要以超级用户(root)身份运行 imqkeytool 命令,以获得创建密钥库所需的权限。)
首先,imqkeytool 提示您输入密钥库密码,然后提示您输入组织信息,最后提示您进行确认。收到确认后,它将在生成密钥对时暂停。然后它要求您输入密码以锁定特定密钥对(关键字密码),此时请按回车键响应此提示:这将使关键字密码与密钥库密码相同。
运行 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 的常见方法有两种:
在任一种情况下,都应确保激活 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.HttpsTunnelServletWeb 服务器必须能够访问 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 连接服务
- 打开代理的实例配置文件。
实例配置文件存储在一个目录中,该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识(请参见附录 A“Message Queue 数据在特定操作系统中的位置”):
…/instances/instanceName/props/config.properties
- 将 httpsjms 值添加到 imq.service.activelist 属性中:
imq.service.activelist=jms,admin,httpsjms
启动时,代理将在其主机上查找运行的 Web 服务器和 HTTPS 隧道 Servlet。但是要访问远程隧道 Servlet,需要重新配置 servletHost 和 servletPort 连接服务属性。
还可以重新配置 pullPeriod 属性以提高性能。表 C-3 详细介绍了 httpsjms 连接服务配置属性。
步骤 4:配置 HTTPS 连接
客户机应用程序必须使用正确配置的连接工厂管理对象,建立与代理之间的 HTTPS 连接。
但是,客户机还必须能够访问 Java 安全套接扩展 (JSSE) 提供的 SSL 库,并且必须具有一个根证书。SSL 库是随 JDK 1.4 一起提供的。如果您使用的是早期版本的 JDK,请参见配置 JSSE;否则,请转至输入根证书。
解决上述问题后,可以继续配置 HTTPS 连接。
配置 JSSE
配置 JSSE
- 将 JSSE Jar 文件复制到 JRE_HOME/lib/ext 目录中。
包括 jsse.jar、jnet.jar 和 jcert.jar
- 通过添加以下内容来静态添加 JSSE 安全服务供应商:
security.provider.n=com.sun.net.ssl.internal.ssl.Provider
将这些内容添加到 JRE_HOME/lib/security/java.security 文件中,(其中 n 是安全服务供应商软件包的下一个可用优先编号)。
- 如果使用的不是 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 Developer's Guide for Java Clients。
可以按照以下方法之一设置连接工厂属性:
- 在创建连接工厂管理对象(请参见添加连接工厂)的 imqobjmgr 命令中使用 -o 选项,或在使用管理控制台 (imqadmin) 创建连接工厂管理对象时设置属性。
- 在启动客户机应用程序的命令中使用 -D 选项(请参见 Message Queue Developer's Guide for Java Clients)。
- 通过编程方式在客户机应用程序代码中创建连接工厂(请参见 Message Queue Developer's Guide for Java Clients)之后,使用 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 隧道 servlet 就绪。
Servlet 开始时间:Thu May 30 01:08:18 PDT 2002
接受端口上来自代理的安全连接: 7674
可用代理总数 = 2
代理列表:
jpgserv:broker2
cochin:broker1
使用 HTTP 代理
如果使用 HTTP 代理访问 HTTPS 隧道 Servlet:
可以通过在启动客户机应用程序的命令中使用 -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 的情况。此过程包含以下通用步骤:
在以下小节中,对这些步骤进行了说明。通过使用 Web 浏览器访问 Servlet URL 可以验证是否成功部署了 HTTPS 隧道 Servlet。它应该显示状态信息。
添加 Servlet
添加隧道 Servlet
- 选择 "Servlets" 选项卡。
- 选择“配置 Servlet 属性”。
- 在“Servlet 名称”字段中指定隧道 Servlet 的名称。
- 将“Servlet 代码”(类名)字段设置为以下值:
com.sun.messaging.jmq.transport.
httptunnel.servlet.HttpsTunnelServlet- 在“Servlet 类路径”字段中输入 imqservlet.jar 的完整路径。例如:
/usr/share/lib/imq/imqservlet.jar (Solaris)
/opt/sun/mq/share/lib/imqservlet.jar (Linux)
IMQ_HOME/lib/imqservlet.jar (Windows)
- 在“Servlet 参数”字段中输入必需参数和可选参数,如表 C-4 所示。
表 C-4 用于部署 HTTPS 隧道 Servlet Jar 文件的 Servlet 参数
参数
默认值
是否必需?
keystoreLocation
无
是
keystorePassword
无
是
servletHost
所有主机
否
servletPort
7674
否
参数之间以逗号分隔。例如:
keystoreLocation=keystore_location,keystorePassword=keystore_password, servletPort=portnumber
servletHost 和 servletPort 参数仅应用于 Web 服务器和代理之间的通信,仅当默认值存在问题时才需要进行设置。但是,在这种情况下,还必须相应地设置代理配置属性(请参见表 C-3)。例如:
imq.httpsjms.https.servletPort
配置 Servlet 虚拟路径 (Servlet URL)
配置隧道 Servlet 的虚拟路径 (Servlet URL)
- 选择 "Servlets"选项卡。
- 选择“配置 Servlet 虚拟路径转换”。
- 设置“虚拟路径”字段。
“虚拟路径”是隧道 Servlet URL 的 /contextRoot/tunnel 分区:
https://hostName:port/contextRoot/tunnel
例如,如果将 contextRoot 设置为 imq,则“虚拟路径”字段将为:
/imq/tunnel
- 设置“Servlet 名称”字段的值,使之与添加 Servlet 中的步骤 3 中设置的值相同。
装入 Servlet
在 Web 服务器启动时装入隧道 Servlet
- 选择 "Servlets" 选项卡。
- 选择“配置全局属性”。
- 在“开启 Servlets”字段中,输入与添加 Servlet 中的步骤 3 中的值相同的 Servlet 名称值。
禁用服务器访问日志
不是必须禁用服务器访问日志,但禁用服务器访问日志可以获得更佳的性能。
禁用服务器访问日志部署为 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 文件
- 将 WAR 文件复制到临时目录中。
cp /usr/share/lib/imq/imqhttps.war /tmp (Solaris)
cp /opt/sun/mq/share/lib/imqhttps.war /tmp (Linux)
cp IMQ_HOME/lib/imqhttps.war /tmp (Windows)
- 使临时目录成为当前目录。
$ cd /tmp
- 提取 WAR 文件的内容。
$ jar xvf imqhttps.war
- 列出 WAR 文件的部署描述符。
$ ls -l WEB-INF/web.xml
- 编辑 web.xml 文件,以提供正确的 keystoreLocation 和 keystorePassword 参数值(如有必要,还包括 servletPort 和 servletHost 参数)。
- 重新装入 WAR 文件的内容。
$ jar uvf imqhttps.war WEB-INF/web.xml
现在即可使用这个修改后的 imqhttps.war 文件部署 HTTPS 隧道 Servlet 了。(如果担心会泄漏密钥库密码,可以使用文件系统权限限制对 imqhttps.war 文件的访问。)
将 HTTPS 隧道 Servlet 部署为 WAR 文件
- 在基于浏览器的管理 GUI 中,选择“虚拟服务器类”选项卡。单击“管理类”。
- 选择相应的虚拟服务器类名(例如,defaultClass)并单击“管理”按钮。
- 选择“管理虚拟服务器”。
- 选择相应的虚拟服务器名称并单击“管理”按钮。
- 选择“Web 应用程序”选项卡。
- 单击“部署 Web 应用程序”。
- 为“WAR 文件打开”和“WAR 文件路径”字段选择相应的值,以指向修改后的 imqhttps.war 文件(请参见修改 HTTPS 隧道 Servlet WAR 文件)。
- 在“应用程序 URI”字段中输入路径。
“应用程序 URI”字段值为隧道 Servlet URL 的 /contextRoot 分区:
https://hostName:port/contextRoot/tunnel
例如,如果将 contextRoot 设置为 imq,则“应用程序 URI”字段将为:
/imq
- 输入要在其中部署 Servlet 的安装目录路径(通常位于 Sun Java System Web Server 的安装根目录下)。
- 单击“确定”。
- 重新启动 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
- 在基于 Web 的管理 GUI 中,选择
“应用服务器”>“实例”>“服务器 1”>“应用程序”>“Web 应用程序”。
- 单击“部署”按钮。
- 在“文件路径:”文本字段中,输入 HTTPS 隧道 Servlet WAR 文件 (imqhttps.war) 的位置。
imqhttps.war 文件的位置因操作系统而异(请参见附录 A“Message Queue 数据在特定操作系统中的位置”)
- 单击“确定”。
- 在下一个屏幕上,设置“上下文根”文本字段的值。
“上下文根”字段值为隧道 Servlet URL 的 /contextRoot 分区:
https://hostName:port/contextRoot/tunnel
例如,可以将“上下文根”字段设置为:
/imq
- 单击“确定”。
下一个屏幕显示隧道 Servlet 已成功部署,默认情况下处于启用状态,在这种情况下,它位于以下位置:
/var/opt/SUNWappserver7/domains/domain1/server1/applications/
j2ee-modules/imqhttps_1Servlet 现在即被部署到以下位置:
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 文件
疑难解答本节介绍了 HTTP 或 HTTPS 连接可能会出现的问题,并提供如何解决这些问题的指导。
服务器或代理故障
如果 Web 服务器出现故障并重新启动,所有连接都将恢复且不会对客户机产生影响。然而,如果代理出现故障并重新启动,将引发异常,而客户机必须重新建立连接。
如果 Web 服务器和代理同时出现故障,而代理没有重新启动,则 Web 服务器将恢复客户机连接并继续等待代理恢复连接而不会通知客户机。要避免这种情况,请务必重新启动代理。
客户机无法通过隧道 Servlet 进行连接
如果 HTTPS 客户机无法通过隧道 Servlet 与代理建立连接,请执行以下操作:
服务恢复后,HTTPS 客户机应该能够通过隧道 Servlet 与代理建立连接。