Sun Java System Message Queue 3.7 UR1 管理指南

启用 HTTPS 支持

以下各节说明了启用 HTTPS 支持的步骤。 这些步骤与启用 HTTP 支持中的步骤类似,只是增加了生成和访问 SSL 证书的步骤。

Procedure启用 HTTPS 支持

  1. 为 HTTPS 隧道 Servlet 生成自签名证书。

  2. 修改 HTTPS 隧道 Servlet .war 文件的部署描述符,以便:

    • 指向放置证书密钥库的位置

      • 指定证书密钥库密码

  3. 部署 HTTPS 隧道 Servlet。可以在以下服务器上部署 HTTPS 隧道 Servlet:

    • Sun Java System Web Server

      • Sun Java System Application Server

  4. 配置代理的 httpsjms 连接服务并启动代理。

  5. 配置 HTTPS 连接。

    以下各节详细介绍了其中每个步骤。

步骤 1:为 HTTPS 隧道 Servlet 生成自签名证书

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

运行 keytool 实用程序,以便为隧道 Servlet 生成自签名证书。 在命令提示符下输入以下内容:

JRE_HOME/bin/keytool -servlet keyStoreLocation

命令行实用程序会提示您提供所需的信息。(在 Unix 系统上,您可能需要以超级用户 (root) 身份运行 keytool 才能获取创建密钥库的权限。)

首先,keytool 提示您输入密钥库密码,并提示您输入一些组织信息,然后提示您进行确认。 收到确认后,它将在生成密钥对时暂停。然后它要求您输入密码以锁定特定的密钥对(密钥密码),此时应按回车键来响应此提示:这样做会使密钥密码与密钥库密码相同。


注 –

请记住输入的密码:稍后您必须将此密码提供给隧道 Servlet,以便它可以打开密钥库。


JDK keytool 实用程序生成一个自签名证书,并将其放入 Message Queue 的密钥库文件中,该文件的位置在 keyStoreLocation 参数中指定。


注 –

HTTPS 隧道 Servlet 必须能够访问该密钥库。请确保将生成的密钥库(位于 keyStoreLocation )移动/复制到 HTTPS 隧道 Servlet 可以访问的位置(请参见步骤 3:部署 HTTPS 隧道 Servlet)。


步骤 2:修改 HTTPS 隧道 Servlet .war 文件的描述符文件

HTTPS 隧道 Servlet 的 .war 文件包含一个部署描述符,该描述符包含 Web 服务器/应用服务器装入和运行该 Servlet 时所需的基本配置信息。

imqhttps.war 文件的部署描述符无法知道该隧道 Servlet 所需的密钥库文件的放置位置。 因此在部署 imqhttps.war 文件之前,必须编辑隧道 Servlet 的部署描述符(一个 XML 文件),以指定密钥库的位置和密码。

Procedure修改 HTTPS 隧道 Servlet .war 文件

  1. .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)

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

    $ cd /tmp

  3. 提取 .war 文件的内容。

    $ jar xvf imqhttps.war

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

    $ ls -l WEB-INF/web.xml

  5. 编辑 web.xml 文件,为 keystoreLocationkeystorePassword 参数(如有必要,还包括 servletPortservletHost 参数)提供正确的值。

  6. 重新装入.war 文件的内容。

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

    现在即可使用修改后的 imqhttps.war 文件来部署 HTTPS 隧道 Servlet。 (如果您担心泄漏密钥库密码,可以使用文件系统权限限制对 imqhttps.war 文件的访问。)

步骤 3:部署 HTTPS 隧道 Servlet

在 Sun Java System Web Server 或 Sun Java System 上,可以将 HTTPS 隧道 Servlet 作为 Web 归档 (WAR) 文件进行部署。

将 HTTPS 隧道 Servlet 作为 .war 文件部署时,需要使用 Web 服务器/应用服务器提供的部署机制。 HTTPS 隧道 Servlet .war 文件 (imqhttps.war ) 所在的目录因操作系统而异(请参见附录 A, Message QueueTM 数据在特定平台上的位置)。

您应该确保激活 Web 服务器的加密功能,以使客户端与代理之间的端到端通信是安全的。

作为 Web 归档文件部署

有关在 Sun Java System Web Server 上部署的信息,请参见在 Sun Java System Web Server 上部署 HTTPS 隧道 Servlet

有关在 Sun Java System 上部署的信息,请参见在 Sun Java System Application Server 上部署 HTTPS 隧道 Servlet

在 Sun Java System Web Server 上部署 HTTPS 隧道 Servlet

本节说明了如何在 Sun Java System Web Server 上将 HTTPS 隧道 Servlet 作为 .war 文件部署。 通过使用 Web 浏览器访问 Servlet URL,可以验证 HTTPS 隧道 Servlet 的部署是否成功。 它应该显示状态信息。

在部署 HTTPS 隧道 Servlet 之前,请确保 JSSE .jar 文件包含在 Web 服务器的类路径中。 要达到此目的,最简单的方法是将 jsse.jarjnet.jar jcert.jar 文件复制到 WebServer_TOPDIR/bin/https/jre/lib/ext

Procedure将 HTTPS 隧道 Servlet 作为 .war 文件部署

  1. 在基于浏览器的管理 GUI 中,选择“虚拟服务器类”选项卡。 单击“管理类”。

  2. 选择相应的虚拟服务器类名(例如, defaultClass)并单击“管理”按钮。

  3. 选择“管理虚拟服务器”。

  4. 选择相应的虚拟服务器名称并单击“管理”按钮。

  5. 选择“Web 应用程序”选项卡。

  6. 单击“部署 Web 应用程序”。

  7. 为“WAR 文件位置”和“WAR 文件路径”字段选择相应的值,以指向修改后的 imqhttps.war 文件(请参见步骤 2:修改 HTTPS 隧道 Servlet .war 文件的描述符文件。)

  8. 在“应用程序 URI”字段中输入路径。

    “应用程序 URI”字段值为隧道 Servlet URL 的 /contextRoot 部分:

    https://hostName :portNumber / contextRoot/tunnel

    例如,如果将 contextRoot 设置为 imq,则“应用程序 URI”字段为:

    /imq

  9. 输入要在其中部署 Servlet 的安装目录路径(通常位于 Sun Java System Web Server 的安装根目录下)。

  10. 单击“确定”。

  11. 重新启动 Web 服务器实例。

    Servlet 现在即被部署到以下 URL:


    https://hostName:portNumber/imq/tunnel

    客户端现在即可使用此 URL 通过安全的 HTTPS 连接来连接到消息服务。

禁用服务器访问日志

您不必禁用服务器访问日志,但禁用服务器访问日志可以获取更佳性能。

Procedure禁用服务器访问日志

  1. 选择“状态”选项卡。

  2. 选择“日志参考页”。

    请使用日志客户端访问控制来禁用日志记录。

在 Sun Java System Application Server 上部署 HTTPS 隧道 Servlet

本节说明了如何在 Sun Java System Application Server 上将 HTTPS 隧道 Servlet 作为 .war 文件部署。

需要执行两个步骤:

使用部署工具

以下过程说明了如何在应用服务器环境中部署 HTTPS 隧道 Servlet。

Procedure在应用服务器环境中部署 HTTPS 隧道 Servlet。

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

    “应用服务器”>“实例”> "server1" >“应用程序”>“Web 应用程序”

  2. 单击“部署”按钮。

  3. 在“文件路径:”文本字段中,输入 HTTPS 隧道 Servlet .war 文件 (imqhttps.war) 的位置,然后单击“确定”。

    imqhttps.war 文件的位置因操作系统而异(请参见附录 A, Message QueueTM 数据在特定平台上的位置)。

  4. 设置“上下文根”文本字段的值,然后单击“确定”。

    “上下文根”字段的值是隧道 Servlet URL 的 /contextRoot 部分:

    https://hostName :portNumber / contextRoot/tunnel

    例如,可以将“上下文根”字段设置为:

    /imq

    下一个屏幕显示隧道 Servlet 已成功部署,在默认情况下处于启用状态,并且在本例中该 Servlet 位于以下位置:


    /var/opt/SUNWappserver8/domains/domain1/server1/applications/
    j2ee-modules/imqhttps_1

    Servlet 现在即被部署到以下 URL:


    https://hostName:portNumber/
    contextRoot/tunnel

    客户端现在即可使用此 URL 通过 HTTPS 连接来连接到消息服务。

修改 server.policy 文件

应用服务器实施了一组默认安全策略,除非经过修改,否则它们将阻止 HTTPS 隧道 Servlet 接受来自 Message Queue 代理的连接。

每个应用服务器实例都有一个包含安全策略或规则的文件。例如,server1 实例的此文件在 Solaris 上的位置为:

/var/opt/SUNWappserver8/domains/domain1/server1/config/
server.policy

要配置隧道 Servlet 以接受来自 Message Queue 代理的连接,此文件中还必须包含另一个条目。

Procedure修改应用服务器的 server.policy 文件

  1. 打开 server.policy 文件。

  2. 添加以下条目:


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

步骤 4:配置 httpsjms 连接服务

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

Procedure激活 httpsjms 连接服务

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

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

    /instances/ instanceName /props/config.properties

  2. httpsjms 值添加到 imq.service.activelist 属性中:


    imq.service.activelist=jms,admin,httpsjms

    启动时,代理将查找 Web 服务器以及在其主机上运行的 HTTPS 隧道 Servlet。但是,要访问远程隧道 Servlet,可以重新配置 servletHostservletPort 连接服务属性。

    此外,还可以重新配置 pullPeriod 属性来改善性能。 步骤 4:配置 httpsjms 连接服务详细介绍了 httpjms 连接服务配置属性。

    属性 

    描述 

    imq.httpsjms.https.servletHost

    必要时可以更改此值,以指定运行 HTTPS 隧道 Servlet 的主机的名称(主机名或 IP 地址)。(可以是远程主机或本地主机上的特定主机名。)默认值:localhost

    imq.httpsjms.https. servletPort

    更改此值可以指定代理用于访问 HTTPS 隧道 Servlet 的端口号。(如果在 Web 服务器上更改了默认端口号,则必须对此属性做相应的更改。)默认值:7674

    imq.httpsjms.https. pullPeriod

    指定每个客户端发出从代理提取消息的 HTTPS 请求的时间间隔(以秒为单位)。 (请注意,此属性在代理上设置并传播到客户端运行时环境。)如果值为零或负数,客户端将始终使一个 HTTPS 请求处于待处理状态,这样可以随时尽快地提取消息。 如果客户端数量过多,这样做会消耗大量的 Web 服务器资源,从而导致服务器停止响应。 在这种情况下,应该将 pullPeriod 属性设置为正的秒数值。 此属性设置客户端 HTTPS 传输驱动程序在发出下一个提取请求之前等待的时间。 将该值设置为正数可以节省 Web 服务器资源,但却延长了客户端等待响应的时间。 默认值:-1

    imq.httpsjms.https. connectionTimeout

    指定客户端运行时环境等待 HTTPS 隧道 Servlet 响应的时间(以秒为单位),超过此时间后将抛出异常。 (请注意,此属性在代理上设置并传播到客户端运行时环境。)此属性还指定代理与 HTTPS 隧道 Servlet 通信后等待连接断开的时间。在这种情况下设置超时时间是必要的,因为代理和隧道 Servlet 无法知道访问 HTTPS Servlet 的客户端是否已异常终止。 默认值:60

步骤 5:配置 HTTPS 连接

客户端应用程序必须使用正确配置的连接工厂受管理对象才能建立与代理的 HTTPS 连接。

但是,客户端还必须能够访问 Java 安全套接扩展 (Java Secure Socket Extension, JSSE) 提供的 SSL 库,并且还必须有一个根证书。SSL 库是随 JDK 1.4 一起提供的。如果您使用的是早期版本的 JDK,请参见配置 JSSE;否则,请参见导入根证书

解决上述问题后,即可开始配置 HTTPS 连接。

配置 JSSE

Procedure配置 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 服务器/应用程序证书,则必须将该证书添加到信任数据库中。 如果存在上述情况,请按照下面的说明执行操作;否则,请转到配置连接工厂

假定证书保存在 certFile 中,且 trustStoreFile 是您的密钥库,请运行以下命令:

JRE_HOME/bin/keytool -import -trustcacerts
 -alias aliasForCertificate -file certFile

-keystore trustStoreFile

对显示的如下问题回答 YESTrust this certificate?

此外,还需要在启动客户端应用程序的命令中使用 -D 选项来指定以下 JSSE 属性:

javax.net.ssl.trustStore=trustStoreFile
javax.net.ssl.trustStorePassword=trustStorePasswd

配置连接工厂

要启用 HTTPS 支持,必须将连接工厂的 imqAddressList 属性设置为 HTTPS 隧道 Servlet URL。 HTTPS 隧道 Servlet URL 的一般语法如下:

https://hostName:portNumber

/contextRoot/tunnel

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

有关连接工厂属性,特别是有关 imqAddressList 属性的详细信息,请参见 Message Queue Developer's Guide for Java Clients

可以使用以下方法之一设置连接工厂属性:

使用一个 Servlet 访问多个代理

如果正在运行多个代理,您不必配置多个 Web 服务器和多个 Servlet 实例。 可以在并发运行的多个代理之间共享一个 Web 服务器和一个 HTTPS 隧道 Servlet 实例。如果多个代理实例共享一个隧道 Servlet,则必须如下所示配置 imqAddressList 连接工厂属性:

https://hostName:portNumber

/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:

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