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

> ## 附錄C
> HTTP/HTTPS 支援 (企業版)

> Message Queue 企業版 (請參閱「產品版本」) 包括 HTTP 與 HTTPS 連接的支援。(HTTPS 為安全套接層 - SLL - 上 HTTP 的傳輸連接。)此支援可讓用戶端應用程式使用 HTTP 協定 (並非直接的 TCP 連接) 與代理程式通訊。本附錄描述用於啟用此支援的架構，並介紹允許用戶端使用基於 HTTP 的連接進行 Message Queue 訊息傳送所需的設定工作。

> 備註 | HTTP/HTTPS 支援可用於 Java 用戶端，但不適用於 C 用戶端。

> ##

> HTTP/HTTPS 支援架構

> Message Queue 訊息傳送可在 HTTP/HTTPS 連接的頂層執行。由於通常可允許 HTTP/HTTPS 連接通過防火牆，因此可允許透過防火牆將用戶端應用程式與代理程式分隔。

> 圖 C-1 顯示提供 HTTP/HTTPS 支援所需的主要元件。

> - 在用戶端，HTTP 或 HTTPS 傳輸驅動程式將 Message Queue 訊息封裝在 HTTP 請求中，並確保這些請求以正確的序列傳送至 Web Server。
> - 如有必要，用戶端可使用 HTTP 代理伺服器與代理程式進行通訊。代理的位址在啟動用戶端時使用指令行選項指定。請參閱「使用 HTTP 代理」，以獲得更多資訊。
> - HTTP 或 HTTPS 通道 Servlet (均隨附於 Message Queue) 被載入 Web Server 中，並用於在將 JMS 訊息轉寄至代理程式之前，將它們從用戶端 HTTP 請求中移除。HTTP/HTTPS 通道 Servlet 也會將代理程式訊息傳送回用戶端，以確認用戶端發出的 HTTP 請求。單一 HTTP/HTTPS 通道 Servlet 可用於存取多重代理程式。

> 圖 C-1 HTTP/HTTPS 支援架構

> - 在代理程式端，會展開 httpjms 或 httpsjms 連接服務並多路傳輸從相應通道 Servlet 進來的訊息。
> - 如果 Web Server 發生故障並重新啟動，則所有連接均會復原且不影響用戶端。如果代理程式發生故障並重新啟動，則系統會拋出異常，且用戶端必須重新建立它們的連接。如果 Web Server 與代理程式均發生故障，且未重新啟動代理程式 (這種情況不太可能發生)，則 Web Server 會復原用戶端連接並繼續等待代理程式連接，且不通知用戶端。若要避免這種情況，請務必重新啟動代理程式。

> 如圖 C-1 中所示，HTTP 和 HTTPS 支援的架構非常相似。主要區別在於，對於 HTTPS (httpsjms 連接服務)，通道 Servlet 具有與用戶端應用程式和代理程式的安全連接。

> 可透過已啟用 SSL 的通道 Servlet (Message Queue 的 HTTPS 通道 Servlet) 提供與代理程式的安全連接。此通道 Servlet 將自身簽名的憑證傳送至請求連接的任何代理程式。代理程式使用此憑證來設定與 HTTPS 通道 Servlet 的加密連接。一旦建立此連接，用戶端應用程式與通道 Servlet 之間的安全連接可由用戶端應用程式和 Web Server 協商。

> ##

> 啟用 HTTP 支援

> 以下各節描述啟用 HTTP 支援所需採取的步驟。

> #####
> 啟用 HTTP 支援

> 1. 在 Web Server 上部署 HTTP 通道 Servlet。
> 2. 配置代理程式的 httpjms 連接服務並啟動代理程式。
> 3. 配置 HTTP 連接。

> ### 步驟 1. 在 Web Server 上部署 HTTP 通道 Servlet

> 在 Web Server 上部署 HTTP 通道 Servlet 有兩種常用方法：

> - 將其部署為 JAR 檔案 - 用於支援 Servlet 2.1 或較低版本的 Web Server
> - 將其部署為 Web 歸檔 (WAR) 檔案 - 用於支援 Servlet 2.2 或較高版本的 Web Server

> #### 部署為 JAR 檔案

> 部署 Message Queue 通道 Servlet 由三個部分組成：使主機 Web Server 存取適當的 JAR 檔案，配置此 Web Server 以在啟動時載入 Servlet，以及指定 Servlet URL 的環境根式部分。

> 通道 Servlet JAR 檔案 (imqservlet.jar) 包含 HTTP 通道 Servlet 需要的所有類別，您可以在某個目錄 (目錄位置因作業系統而異) 中找到這個檔案 (請參閱附錄 A「Message Queue 資料的位置」)。

> 支援 Servlet 2.x 的任何 Web Server 均可用於載入此 Servlet。Servlet 類別名稱為：

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

> Web Server 必須可查看 imqservlet.jar 檔案。如果您想在不同的主機上執行 Web Server 和代理程式，則應將 imqservlet.jar 檔案的副本放在 Web Server 可存取的位置。

> 您也必須配置 Web Server，以便在啟動時載入此 Servlet。另外，您可能必須指定 Serlet URL 的環境根式部分 (請參閱「範例 1︰在 Sun Java System Web Server 上部署 HTTP 通道 Servlet」)。

> 為了提昇效能，我們還建議您停用 Web Server 的存取記錄功能。

> #### 部署為 Web 歸檔檔案

> 將 HTTP 通道 Servlet 部署為 WAR 檔案，需要使用 Web Server 提供的部署機制。HTTP 通道 Servlet WAR 檔案 (imqhttp.war) 位於包含 .JAR、.WAR 與 .RAR 檔案的目錄中，目錄位置因作業系統而異 (請參閱附錄 A「Message Queue 資料的位置」)。

> WAR 檔案包括部署描述元，此描述元包含 Web Server 載入和執行 Servlet 所需的基本配置資訊。因 Web Server 的不同，您也可能必須指定 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 Server 和 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 Server 上的預設連接埠已變更，則您必須相應地變更此特性。) 預設值： 7675
> imq.httpjms.http. pullPeriod | 指定用戶端發出從代理程式移除訊息的 HTTP 請求的間隔時間 (以秒為單位)。(請注意，此特性於代理程式上進行設定，且傳遞至用戶端執行階段。)如果值為零或負數，則用戶端將始終擱置一個 HTTP 請求，以準備儘快移除訊息。若用戶端數目過大，可能會導致 Web Server 資源大量外流，且伺服器可能沒有確認。在此類情況下，您應將 pullPeriod 特性設定為正的秒數。此作業將設定用戶端的 HTTP 傳輸驅動程式在發出後續移除請求之前等待的時間。將此值設定為正數可保存 Web Server 資源，但會影響用戶端所監視的確認次數。預設值： -1
> imq.httpjms.http. connectionTimeout | 指定用戶端執行階段在系統拋出異常前，等待從 HTTP 通道 Servlet 發出確認的時間 (以秒為單位)。(請注意，此特性於代理程式上進行設定，且傳遞至用戶端執行階段。)此特性也會指定中斷連接前，代理程式與 HTTP 通道 Servlet 進行通訊後，代理程式等待的時間。因為代理程式與通道 Servlet 無法得知存取 HTTP Servlet 的用戶端是否已異常中斷，在此情況下，必須設定逾時時間。預設值： 60

> ### 步驟 3. 配置 HTTP 連接

> 用戶端應用程式必須使用已適當配置的連線工廠受管理物件，以建立與代理程式的 HTTP 連接。本節說明 HTTP 連接配置問題。

> #### 配置連線工廠

> 若要啟用 HTTP 支援，您必須將連線工廠的 imqAddressList 屬性設定至 HTTP 通道 Serlet URL。HTTP 通道 Servlet URL 的一般語法如下：

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

> hostName:port 為代管 HTTP 通道 Servlet 之 Web Server 的名稱和連接埠；contextRoot 為在 Web Server 上部署通道 Servlet 的路徑設定。

> 如需連線工廠屬性的一般資訊與 imqAddressList 屬性的特定資訊，請參閱「Message Queue Java 用戶端開發人員指南」。

> 您可以透過以下方法之一設定連線工廠屬性：

> - 使用可建立連線工廠受管理物件 (請參閱「新增連線工廠」) 之 imqobjmgr 指令的 -o 選項，或在使用管理主控台 (imqadmin) 建立連線工廠受管理物件時設定屬性。
> - 使用可啟動用戶端的指令的 -D 選項 (請參閱「Message Queue Java 用戶端開發人員指南」)。
> - 當您有計劃藉由用戶端程式碼建立連線工廠後，請使用 API 呼叫設定它的屬性 (請參閱「Message Queue Java 用戶端開發人員指南」)。

> #### 使用單一 Servlet 存取多重代理程式

> 如果您要執行多重代理程式，則無需配置多重 Web Server 和 Servlet 實例。您可以在同時執行的代理程式中共用單一 Web Server 和 HTTP 通道 Servlet 實例。如果多重代理程式實例正共用一個通道 Servlet，您必須配置 imqAddressList 連線工廠屬性，配置內容如下：

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

> bkrHostName 為代理程式實例主機名稱；instanceName 為您用戶端存取的特定代理程式實例名稱。

> 若要檢查您是否已為 bkrHostName 和 instanceName 輸入正確的字串，則應透過從瀏覽器存取 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 的版本：如果它不支援 Servlet 2.2 或較高版本，它將無法處理 WAR 檔案部署。

> #### 部署為 JAR 檔案

> 以下說明參考了使用基於瀏覽器的管理 GUI 之 Sun Java System Web Server 6.1 上的部署。此程序包含以下常用步驟：

> 1. 新增 Servlet
> 2. 配置 Servlet 虛擬路徑
> 3. 載入 Servlet
> 4. 停用 Servlet 存取記錄

> 這些步驟將在以下各小節中描述。您可以透過使用 Web 瀏覽器存取 Servlet URL 來驗證成功的 HTTP 通道 Servlet 部署。它應顯示狀態資訊。

> ##### 新增 Servlet

> ##### 新增通道 Servlet

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置 Servlet 屬性]。
> 3. 在 [Servlet 名稱] 欄位中，指定通道 Servlet 的名稱。
> 4. 將 [Servlet 程式碼 (類別名稱)] 欄位設定為以下值：

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

> 5. 在 [Servlet 類別路徑] 欄位中輸入 imqservlet.jar 的完整路徑。例如：

> 在 Solaris 上為 /usr/share/lib/imq/imqservlet.jar

> 在 Linux 上為 /opt/imq/lib/imqservlet.jar

> 在 Windows 上為 IMQ_HOME/lib/imqservlet.jar

> 6. 在 [Servlet 引數] 欄位中，輸入任何選擇性引數，如表 C-2 中所示：

> 表 C-2 用於部署 HTTP 通道 Servlet JAR 檔案的 Servlet 引數

> 引數 | 預設值 | 參考
> --- | --- | ---
> servletHost | 所有主機 | 請參閱表 C-1
> servletPort | 7675 | 請參閱表 C-1

> 如果要使用這兩個引數，請使用逗號將它們分隔：

> servletPort=連接埠號, servletHost=...

> servletHost 和 servletPort 引數僅適用於 Web Server 和代理程式之間的通訊，並且僅在預設值有問題時才設定。但是，在此情況下，您還必須相應地設定代理程式配置特性 (請參閱表 C-1)，例如：

> imq.httpjms.http.servletPort

> ##### 配置 Servlet 虛擬路徑 (Servlet URL)

> ##### 若要配置通道 Servlet 的虛擬路徑 (Servlet URL)

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置 Servlet 虛擬路徑轉換]。
> 3. 設定 [虛擬路徑] 欄位。

> 「虛擬路徑」為通道 Servlet URL 的 /contextRoot/tunnel 的一部份：

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

> 舉例來說，如果您將 contextRoot 設定至 imq，那麼 [虛擬路徑] 欄位則為：

> /imq/tunnel

> 4. 將 [Servlet 名稱] 欄位設定為與「新增 Servlet」的步驟 3中相同的值。

> ##### 載入 Servlet

> ##### 在啟動 Web Server 時載入通道 Servlet

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置全域屬性]。
> 3. 在 [啟動 Servlet] 欄位中，輸入與「新增 Servlet」的步驟 3中相同的 Servlet 名稱值。

> ##### 停用伺服器存取記錄

> 您不必停用伺服器存取記錄，但是如果您停用記錄，將會獲得更好的效能。

> ##### 停用伺服器存取記錄

> 1. 選取 [狀態] 標籤。
> 2. 選擇 [記錄個人喜好頁面]。
> 3. 使用記錄用戶端存取控制來停用記錄

> #### 部署為 WAR 檔案

> 以下說明參考了 Sun Java System Web Server 6.0 Service Pack 2 上的部署。您可以透過使用 Web 瀏覽器存取 Servlet URL 來驗證成功的 HTTP 通道 Servlet 部署。它應顯示狀態資訊。

> #####
> 將 HTTP 通道 Servlet 部署為 WAR 檔案

> 1. 在基於瀏覽器的管理 GUI 中，選取 [虛擬伺服器類別] 標籤並選取 [管理類別]。
> 2. 選取適當的虛擬伺服器類別名稱 (例如 defaultClass)，然後按一下 [管理] 按鈕。
> 3. 選取 [管理虛擬伺服器]。
> 4. 選取適當的虛擬伺服器名稱，然後按一下 [管理] 按鈕。
> 5. 選取 [Web 應用程式] 標籤。
> 6. 按一下 [部署 Web 應用程式]。
> 7. 為 [WAR 檔案開啟] 和 [WAR 檔案路徑] 欄位選取適當的值，以便指向 imqhttp.war 檔案的位置。您可以在某個目錄 (目錄位置因作業系統而異) 中找到這個檔案 (請參閱 附錄 A「Message Queue 資料的位置」)。
> 8. 在 [應用程式 URI] 欄位中輸入路徑。

> [應用程式 URI] 欄位值為通道 Servlet URL 的 /contextRoot 的一部份：

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

> 舉例來說，如果您將 contextRoot 設定至 imq，那麼 [應用程式 URI] 欄位則為：

> /imq

> 9. 輸入應部署 Servlet 的安裝目錄路徑 (通常位於 Sun Java System Web Server 安裝根目錄下)。
> 10. 按一下 [確定]。
> 11. 重新啟動 Web Server 實例。

> 此時，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. 在基於瀏覽器的管理 GUI 中選取

> 應用程式伺服器 > 實例 > server1 > 應用程式 > Web 應用程式。

> 2. 按一下 [部署] 按鈕。
> 3. 在 [檔案路徑:] 文字欄位輸入 HTTP 通道 Servlet WAR 檔案 (imqhttp.war) 的位置。

> imqhttp.war 檔案的位置會因您的作業系統而有差異 (請參閱 附錄 A「Message Queue 資料的位置」)。

> 4. 按一下 [確定]。
> 5. 在下一個畫面，於 [環境根式] 文字欄位中設定數值。

> [環境根式] 欄位值為通道 Servlet URL 的 /contextRoot 的一部份：

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

> 例如，您可以將 [環境根式] 欄位設定為：

> /imq

> 6. 按一下 [確定]。

> 依預設，接著會出現下一個畫面，表示通道 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 的伺服器策略檔案

> 1. 開啟伺服器策略檔案。
> 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 Server 上部署 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 會提示您提供密鑰儲存密碼以及某些組織資訊，然後提示您確認。接收到確認之後，它會在產生鍵對時暫停。然後它會要求您提供密碼，以鎖定特定的鍵對 (鍵密碼)；您應按 [Return] 以確認此提示：這會使鍵密碼與密鑰儲存密碼相同。

> 備註 | 請記住您所提供的密碼 -- 稍後您需要將此密碼提供給通道 Servlet，以便它可開啟密鑰儲存。

> 執行 imqkeytool 可執行 JDK keytool 公用程式，以產生自身簽名的憑證，並將其放在位於 keystore_location 引數所指定的 Message Queue 密鑰儲存檔案中。(此密鑰儲存的格式與 JDK1.2 keytool 支援的格式相同。)

> 備註 | HTTPS 通道 Servlet 必須可查看此密鑰儲存。請確定您將位於 keystore_location 中已產生的密鑰儲存移動/複製到 HTTPS 通道 Servlet 可存取的位置 (請參閱「步驟 2. 在 Web Server 上部署 HTTPS 通道 Servlet」)。

> ### 步驟 2. 在 Web Server 上部署 HTTPS 通道 Servlet

> 在 Web Server 上部署 HTTPS 通道 Servlet 有兩種常用方法：

> - 將其部署為 JAR 檔案 - 用於支援 Servlet 2.1 或較低版本的 Web Server
> - 將其部署為 Web 歸檔 (WAR) 檔案 - 用於支援 Servlet 2.2 或較高版本的 Web Server

> 在這兩種情況下，您都應確保為 Web Server 啟動加密，從而讓用戶端與代理程式之間進行端對端安全通訊。

> #### 部署為 JAR 檔案

> 部署 Message Queue 通道 Servlet 由三個部分組成：使主機 Web Server 存取適當的 JAR 檔案，配置此 Web Server 以在啟動時載入 Servlet，以及指定 Servlet URL 的環境根式部分。

> 通道 Servlet JAR 檔案 (imqservlet.jar) 包含 HTTPS 通道 Servlet 需要的所有類別，您可以在某個目錄 (目錄位置因作業系統而異) 中找到這個檔案 (請參閱附錄 A「Message Queue 資料的位置」)。

> 支援 Servlet 2.x 的任何 Web Server 均可用於載入此 Servlet。Servlet 類別名稱為：

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

> Web Server 必須可查看 imqservlet.jar 檔案。如果您想在不同的主機上執行 Web Server 和代理程式，則應將 imqservlet.jar 檔案的副本放在 Web Server 可存取的位置。

> 您也必須配置 Web Server，以便在啟動時載入此 Servlet。另外，您可能必須指定 Serlet URL 的環境根式部分 (請參閱「範例 3︰在 Sun Java System Web Server 上部署 HTTPS 通道 Servlet」)。

> 確保 JSSE JAR 檔案在類別路徑中，以便在 Web Server 中執行 Servlet。檢查 Web Server 的說明文件，以便瞭解如何執行此作業。

> 配置 Web Server 的一個重要方面是指定自身簽名憑證的位置和密碼，以便 HTTPS 通道 Servlet 使用此憑證來建立與代理程式的安全連接。您必須將「步驟 1. 為 HTTPS 通道 Servlet 產生自身簽名的憑證」中建立的密鑰儲存放在 HTTPS 通道 Servlet 可存取的位置。

> 為了提昇效能，我們還建議您停用 Web Server 的存取記錄功能。

> #### 部署為 Web 歸檔檔案

> 將 HTTPS 通道 Servlet 部署為 WAR 檔案，需要使用 Web Server 提供的部署機制。HTTPS 通道 Servlet WAR 檔案 (imqhttps.war) 位於您作業系統的某個目錄中，目錄位置因作業系統而異 (請參閱 附錄 A「Message Queue 資料的位置」)。

> WAR 檔案包括部署描述元，此描述元包含 Web Server 載入和執行 Servlet 所需的基本配置資訊。因 Web Server 的不同，您也可能必須指定 Servlet URL 的環境根式部分 (請參閱「範例 4︰在 Sun Java System Application Server 7.0 上部署 HTTPS 通道 Servlet」)。

> 但是，imqhttps.war 檔案的部署描述元無法知道您已將通道 Servlet 所需的密鑰儲存檔案放在何處 (請參閱「步驟 1. 為 HTTPS 通道 Servlet 產生自身簽名的憑證」)。這要求您編輯通道 Servlet 的部署描述元 (XML 檔案)，以在部署 imqhttps.war 檔案之前指定密鑰儲存的位置。

> ### 步驟 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 Server 和 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 Server 上的預設連接埠已變更，則您必須相應地變更此特性。) 預設值： 7674
> imq.httpsjms.https. pullPeriod | 指定每個用戶端發出從代理程式中移除訊息的 HTTP 請求的間隔時間 (以秒為單位)。(請注意，此特性於代理程式上進行設定，且傳遞至用戶端執行階段。)如果值為零或負數，則用戶端將始終擱置一個 HTTP 請求，以準備儘快移除訊息。若用戶端數目過大，可能會導致 Web Server 資源大量外流，且伺服器可能沒有確認。在此類情況下，您應將 pullPeriod 特性設定為正的秒數。此作業將設定用戶端的 HTTP 傳輸驅動程式在發出後續移除請求之前等待的時間。將此值設定為正數可保存 Web Server 資源，但會影響用戶端所監視的確認次數。預設值： -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

> #### 匯入超級使用者憑證

> 如果 CA (為您的 Web Server 憑證簽名) 的超級使用者憑證依預設不在信任資料庫中，或者您使用的是專用 Web Server 憑證，則您必須將此憑證新增至信任資料庫。如果出現此情況，請遵循以下說明，否則請參考「配置連線工廠」中的說明。

> 假設此憑證儲存在 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 通道 Serlet URL。HTTPS 通道 Servlet URL 的一般語法如下：

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

> hostName:port 為代管 HTTPS 通道 Servlet 之 Web Server 的名稱和連接埠；contextRoot 為在 Web Server 上部署通道 Servlet 的路徑設定。

> 如需連線工廠屬性的一般資訊與 imqAddressList 屬性的特定資訊，請參閱「Message Queue Java 用戶端開發人員指南」。

> 您可以透過以下方法之一設定連線工廠屬性：

> - 使用可建立連線工廠受管理物件 (請參閱「新增連線工廠」) 之 imqobjmgr 指令的 -o 選項，或在使用管理主控台 (imqadmin) 建立連線工廠受管理物件時設定屬性。
> - 使用可啟動用戶端應用程式的指令的 -D 選項 (請參閱「Message Queue Java 用戶端開發人員指南」)。
> - 當您有計劃藉由用戶端應用程式碼建立連線工廠後，請使用 API 呼叫設定它的屬性 (請參閱「Message Queue Java 用戶端開發人員指南」)。

> #### 使用單一 Servlet 存取多重代理程式

> 如果您要執行多重代理程式，則無需配置多重 Web Server 和 Servlet 實例。您可以在同時執行的代理程式中共用單一 Web Server 和 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 的版本：如果它不支援 Servlet 2.2 或較高版本，它將無法處理 WAR 檔案部署。

> #### 部署為 JAR 檔案

> 以下說明參考了使用基於瀏覽器的管理 GUI 之 Sun Java System Web Server 6.1 上的部署。此程序包含以下常用步驟：

> 1. 新增 Servlet
> 2. 配置 Servlet 虛擬路徑
> 3. 載入 Servlet
> 4. 停用 Servlet 存取記錄

> 這些步驟將在以下各小節中描述。您可以透過使用 Web 瀏覽器存取 Servlet URL 來驗證成功的 HTTPS 通道 Servlet 部署。它應顯示狀態資訊。

> ##### 新增 Servlet

> ##### 新增通道 Servlet

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置 Servlet 屬性]。
> 3. 在 [Servlet 名稱] 欄位中，為通道 Servlet 指定名稱。
> 4. 將 [Servlet 程式碼 (類別名稱)] 欄位設定為以下值：

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

> 5. 在 [Servlet 類別路徑] 欄位中輸入 imqservlet.jar 的完整路徑。例如：

> 在 Solaris 上為 /usr/share/lib/imq/imqservlet.jar

> 在 Linux 上為 /opt/imq/lib/imqservlet.jar

> 在 Windows 上為 IMQ_HOME/lib/imqservlet.jar

> 6. 在 [Servlet 引數] 欄位中，輸入所需引數和選擇性引數，如表 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 Server 和代理程式之間的通訊，並且僅在預設值有問題時才設定。但是，在此情況下，您還必須相應地設定代理程式配置特性 (請參閱表 C-3)，例如：

> imq.httpsjms.https.servletPort

> ##### 配置 Servlet 虛擬路徑 (Servlet URL)

> ##### 若要配置通道 Servlet 的虛擬路徑 (Servlet URL)

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置 Servlet 虛擬路徑轉換]。
> 3. 設定 [虛擬路徑] 欄位。

> 「虛擬路徑」為通道 Servlet URL 的 /contextRoot/tunnel 的一部份：

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

> 舉例來說，如果您將 contextRoot 設定至 imq，那麼 [虛擬路徑] 欄位則為：

> /imq/tunnel

> 4. 將 [Servlet 名稱] 欄位設定為與「新增 Servlet」的步驟 3中相同的值。

> ##### 載入 Servlet

> ##### 在啟動 Web Server 時載入通道 Servlet

> 1. 選取 [Servlets] 標籤。
> 2. 選擇 [配置全域屬性]。
> 3. 在 [啟動 Servlet] 欄位中，輸入與「新增 Servlet」的步驟 3中相同的 Servlet 名稱值。

> ##### 停用伺服器存取記錄

> 您不必停用伺服器存取記錄，但是如果您停用記錄，將會獲得更好的效能。

> ##### 停用伺服器存取記錄

> 1. 選取 [狀態] 標籤。
> 2. 選擇 [記錄個人喜好頁面]。
> 3. 使用記錄用戶端存取控制來停用記錄

> #### 部署為 WAR 檔案

> 以下說明參考了 Sun Java System Web Server 6.0 Service Pack 2 上的部署
> 。您可以透過使用 Web 瀏覽器存取 Servlet URL 來驗證成功的 HTTPS 通道 Servlet 部署。它應顯示狀態資訊。

> 在部署 HTTPS 通道 Servlet 之前，請確保 JSSE JAR 檔案包含在 Web Server 的類別路徑中。執行此作業的最簡單方法為將 jsse.jar、jnet.jar 和 jcert.jar 複製到 IWS60_TOPDIR/bin/https/jre/lib/ext。

> 此外，在部署 HTTPS 通道 Servlet 之前，您必須修改其部署描述元，以指向您放置密鑰儲存檔案的位置，並指定密鑰儲存密碼。

> #####
> 修改 HTTPS 通道 Servlet WAR 檔案

> 1. 將 WAR 檔案複製到暫存目錄。

> 在 Solaris 上為 cp /usr/share/lib/imq/imqhttps.war /tmp

> 在 Linux 上為 cp /opt/imq/lib/imqhttps.war /tmp

> 在 Windows 上為 cp IMQ_HOME/lib/imqhttps.war /tmp

> 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 中，選取 [虛擬伺服器類別] 標籤。按一下 [管理類別]。
> 2. 選取適當的虛擬伺服器類別名稱 (例如 defaultClass)，然後按一下 [管理] 按鈕。
> 3. 選取 [管理虛擬伺服器]。
> 4. 選取適當的虛擬伺服器名稱，然後按一下 [管理] 按鈕。
> 5. 選取 [Web 應用程式] 標籤。
> 6. 按一下 [部署 Web 應用程式]。
> 7. 為 [WAR 檔案開啟] 和 [WAR 檔案路徑] 欄位選取適當的值，以便指向已修改的 imqhttps.war 檔案 (請參閱「修改 HTTPS 通道 Servlet WAR 檔案」。)
> 8. 在 [應用程式 URI] 欄位中輸入路徑。

> [應用程式 URI] 欄位值為通道 Servlet URL 的 /contextRoot 的一部份：

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

> 舉例來說，如果您將 contextRoot 設定至 imq，那麼 [應用程式 URI] 欄位則為：

> /imq

> 9. 輸入應部署 Servlet 的安裝目錄路徑 (通常位於 Sun Java System Web Server 安裝根目錄下)。
> 10. 按一下 [確定]。
> 11. 重新啟動 Web Server 實例。

> 此時，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. 在基於瀏覽器的管理 GUI 中選取

> 應用程式伺服器 > 實例 > server1 > 應用程式 > Web 應用程式。

> 2. 按一下 [部署] 按鈕。
> 3. 在 [檔案路徑:] 文字欄位輸入 HTTPS 通道 Servlet WAR 檔案 (imqhttps.war) 的位置。

> imqhttps.war 檔案的位置會因您的作業系統而有差異 (請參閱 附錄 A「Message Queue 資料的位置」)。

> 4. 按一下 [確定]。
> 5. 在下一個畫面，於 [環境根式] 文字欄位中設定數值。

> [環境根式] 欄位值為通道 Servlet URL 的 /contextRoot 的一部份：

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

> 例如，您可以將 [環境根式] 欄位設定為：

> /imq

> 6. 按一下 [確定]。

> 依預設，接著會出現下一個畫面，表示通道 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 的伺服器策略檔案

> 1. 開啟伺服器策略檔案。
> 2. 新增以下項目：

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

> 上一章 目錄 索引 下一章

> Copyright 2004 Sun Microsystems, Inc. All rights reserved.