Sun Java System Message Queue 3.7 UR1 管理指南

訊息加密

本節說明如何設定以安全通訊端層 (SSL) 標準為基礎的連線服務,在用戶端和代理程式之間傳送加密訊息。Message Queue 支援下列 SSL 型連線服務:

本節後續部分說明如何使用 ssljmsssladmincluster 連線服務,透過 TCP/IP 設定安全連線。如需有關使用 httpsjms 服務,透過 HTTP 設定安全連線的詳細資訊,請參閱附錄 CHTTP/HTTPS 支援

使用自我簽署的憑證

若要透過 TCP/IP 使用 SSL 型連線服務,您必須使用金鑰工具公用程式 (imqkeytool) 產生公開/私密金鑰對。此公用程式將公開金鑰內嵌於自我簽署的憑證中,此憑證將傳送至請求與代理程式連線的用戶端,此用戶端使用此憑證設定加密連線。本節描述如何使用此類自我簽署的憑證,設定 SSL 型服務。

若要提高認證層級,您可以使用憑證授權單位驗證的簽署憑證。相較於自我簽署的憑證,使用簽署憑證需要更多必要步驟。您必須先執行本節所述的步驟,接著執行使用簽署的憑證中的額外步驟。

Message Queue 支援具有自我簽署憑證的 SSL,會認為用戶端正與已知並可信任的伺服器通訊,而保護所傳送的資料。下列程序說明使用自我簽署的憑證設定 SSL 型連線服務的必要步驟。後續小節會詳細說明每個步驟。

Procedure使用自我簽署的憑證設定 SSL 型連線服務

  1. 產生自我簽署的憑證。

  2. 啟用代理程式中的 ssljmsssladmincluster 連線服務。

  3. 啟動代理程式。

  4. 配置並執行用戶端。

    這個步驟僅適用於 ssljms 連線服務,不適用於 ssladmincluster

產生自我簽署的憑證

執行金鑰工具公用程式 (imqkeytool),為代理程式產生自我簽署的憑證。(在 UNIX® 系統上,需要以超級使用者 (root) 的身份執行此公用程式,才擁有建立金鑰庫的權限。)相同的憑證可用於 ssljmsssladmincluster 連線服務。

在指令提示符號下輸入以下內容:

imqkeytool -broker

金鑰工具公用程式會提示您輸入金鑰庫密碼。

   Generating keystore for the broker ...
   Enter keystore password:

接著,公用程式會提示您輸入憑證所屬代理程式的識別資訊。您提供的資訊會組成 X.500 辨別名稱。表 7–5 顯示提示以及提供給每個提示的值。這些值不區分大小寫,而且可以包含空格。

表 7–5 自我簽署憑證所需之識別名稱資訊

提示 

X.500 屬性 

說明 

範例 

What is your first and last name?

commonName (CN)

執行代理程式的伺服器之完全合格的名稱 

mqserver.sun.com

What is the name of your organizational unit?

organizationalUnit (OU)

部門名稱 

purchasing

What is the name of your organization?

organizationName (ON)

較大的組織名稱,例如公司或政府實體。 

My Company, Inc.

What is the name of your city or locality?

localityName (L)

城市或所在地名稱 

San Francisco

What is the name of your state or province?

stateName (ST)

州或省的全名 (不使用縮寫) 

California

What is the two-letter country code for this unit?

country (C)

標準的雙字母國家代碼 

US

輸入完畢後,金鑰工具公用程式會顯示您輸入的資訊,請您確認。例如:

   Is CN=mqserver.sun.com, OU=purchasing, ON=My Company, Inc.,
   L=San Francisco, ST=California, C=US correct?

若要接受目前的值並繼續執行,請輸入 yes;若要重新輸入這些值,請接受預設值或輸入 no。您確認後,此公用程式會產生金鑰對並暫停其他作業。

接著,公用程式會要求您提供用於鎖定金鑰對的密碼 (即金鑰密碼)。看到此提示請按下 Return 鍵,表示金鑰密碼與金鑰庫密碼相同。


備註 –

請記住您指定的密碼。啟動代理程式時必須提供此密碼,代理程式才能開啟金鑰庫。您可以在密碼檔案中儲存金鑰庫密碼 (請參閱密碼檔案)。


金鑰工具公用程式會產生自我簽署的憑證,並將其放置在 Message Queue 的金鑰庫中。金鑰庫所在目錄取決於作業系統,請參閱附錄 AMessage QueueTM 資料的特定平台位置

以下是 SSL 型連線服務之 Message Queue 金鑰庫的可配置特性:

有時您可能需要重新產生金鑰對,以解決某些問題:例如,您忘記了金鑰庫密碼,或者啟動代理程式時, SSL 型服務無法初始化,並且您遇到以下異常:

java.security.UnrecoverableKeyException:Cannot recover key

(如果在產生自我簽署的憑證時,所提供的金鑰密碼與金鑰庫密碼不同,則可能導致此異常。)

Procedure重新產生金鑰對

  1. 移除代理程式的金鑰庫,其位置如附錄 AMessage QueueTM 資料的特定平台位置中所示。

  2. 重新執行 imqkeytool 以產生新的金鑰對,如上所述。

啟用 SSL 型連線服務

若要在代理程式中啟用 SSL 型連線服務,您需要將 ssljms (或 ssladmin) 增加到 imq.service.activelist 特性。

Procedure在代理程式中啟用 SSL 型服務

  1. 開啟代理程式的實例配置檔案。

    實例配置檔案的所在目錄名稱,與此配置檔案相關聯之代理程式實例名稱 (instanceName) 相同 (請參閱附錄 AMessage QueueTM 資料的特定平台位置):

       .../instances/instanceName/props/config.properties
    
  2. 增加表示 imq.service.activelist 特性的項目 (如果項目尚未存在),並將所需的 SSL 型服務納入清單。

    依預設,此特性包括 jmsadmin 連線服務。增加 SSL 型服務或您要啟動的服務 (ssljmsssladmin,或兩者):

    imq.service.activelist=jms,admin,ssljms,ssladmin
    

    備註 –

    請使用 imq.cluster.transport 特性啟用 SSL 型 cluster 連線服務,而非使用 imq.service.activelist 特性;請參閱連線代理程式


  3. 儲存並關閉實例配置檔案。

啟動代理程式

啟動代理程式,提供金鑰庫密碼。您可以透過以下任何一種方法提供密碼:


備註 –

啟動使用 SSL 的代理程式或用戶端時,CPU 使用率可能在幾秒鍾內劇增。這是因為 Message Queue 使用 JSSE (Java Secure Socket Extension) 方法 java.security.SecureRandom 產生隨機數字,此方法建立初始隨機數種子要佔用大量時間。建立種子之後,CPU 使用率會降至正常。


配置並執行 SSL 型用戶端

將用戶端配置為使用 SSL 型連線服務的程序, 根據其為應用程式用戶端 (使用 ssljms 連線服務) 還是 Message Queue 管理用戶端 (例如使用 ssladmin 連線服務的 imqcmd) 而有所不同。

應用程式用戶端

針對應用程式用戶端,您必須確保用戶端在其 CLASSPATH 變數中已指定下列 .jar 檔案:

如果您使用 1.4 版之前的 Java 2 Software Development Kit (J2SDK),也必須包含下列 Java Secure Socket Extension (JSSE) 和 Java Naming and Directory Interface (JNDI) .jar 檔案:

(如果您使用 J2SDK 1.4 或更新版本,因為已內建 JSSE 和 JNDI 支援,則不需要包含這些檔案。)

正確指定 CLASSPATH 檔案後,請啟動用戶端並將其連線至代理程式的 ssljms 連線服務,完成此作業的方法之一是輸入以下指令:

java -DimqConnectionType=TLS clientAppName

如此可告知連線使用 SSL 型連線服務。

管理用戶端

針對管理用戶端,您可以透過在呼叫 imqcmd 指令時加入 -secure 選項,來建立安全連線:例如:

imqcmd list svc -b hostName:portNumber -u adminName -secure

其中 adminName 是 Message Queue 使用者儲存庫中的有效項目。此指令會提示您輸入密碼。(如果您使用平面檔案儲存庫,請參閱變更預設管理員密碼)。

列出連線服務是驗證 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.

使用簽署的憑證

簽署憑證提供的伺服器認證,比自我簽署憑證的伺服器認證更安全。您只能在用戶端和代理程式之間 (不能在叢集的多個代理程式之間) 實作簽署憑證。除了上述配置自我簽署憑證所需步驟之外,您還需要執行下列額外的步驟。後續小節會詳細說明這些步驟。

Procedure使用簽署的憑證

  1. 在金鑰庫中安裝憑證。

  2. 配置 Message Queue 用戶端在建立與代理程式的 SSL 型連線時,請求簽署憑證。

取得並安裝簽署的憑證

下列程序說明如何取得並安裝簽署的憑證。

Procedure取得簽署的憑證

  1. 使用 J2SE keytool 指令,為您在上節中產生的自我簽署憑證,產生憑證簽署請求 (CSR)。

    下列網站提供有關 keytool 指令的資訊:

    http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html

    範例:


    keytool -certreq -keyalg RSA -alias imq -file certreq.csr
            -keystore /etc/imq/keystore -storepass myStorePassword

    這會產生 CSR,將憑證封裝在指定的檔案中 (此範例中的 certreq.csr )。

  2. 使用 CSR 產生或請求簽署的憑證。

    您可以使用下列方法之一:

    • 請 Thawte 或 Verisign 等知名的憑證授權單位 (CA) 簽署憑證。如需如何執行此作業的詳細資訊,請參閱您的 CA 文件。

    • 使用 SSL 簽署套裝軟體,自行簽署憑證。

      簽出的憑證是一串 ASCII 字元。如果您收到 CA 簽署的憑證,它可能是一個電子郵件附件或是郵件中的文字。

  3. 將簽署的憑證儲存在檔案中。

    以下說明中,使用 broker.cer 範例名稱來代表代理程式憑證。

Procedure安裝簽署的憑證

  1. 檢查 J2SE 依預設是否支援您的憑證授權單位。

    以下指令會列出系統金鑰庫中的根 CA:

    keytool -v -list -keystore $JAVA_HOME/lib/security/cacerts
    

    如果有列出您的 CA,請跳過下一個步驟。

  2. 如果 J2SE 未支援您的憑證授權單位,請將 CA 的根憑證匯入 Message Queue 金鑰庫中。

    範例:

    keytool -import -alias ca -file ca.cer -noprompt -trustcacerts
            -keystore /etc/imq/keystore -storepass myStorePassword
    

    其中 ca.cer 檔案包含 CA 提供的根憑證。

    如果您使用 CA 測試憑證,可能需要匯入測試 CA 根憑證。您的 CA 應該會指示如何取得該憑證的副本。

  3. 將簽署的憑證匯入金鑰庫中,替代原始的自我簽署憑證。

    範例:

    keytool -import -alias imq -file broker.cer -noprompt -trustcacerts
            -keystore /etc/imq/keystore -storepass myStorePassword
    

    broker.cer 是您從 CA 獲得的簽署憑證所在的檔案。

    現在 Message Queue 金鑰庫包含簽署憑證,可用於 SSL 連線。

配置 Message Queue 用戶端執行階段以請求簽署憑證

現在您必須配置 Message Queue 用戶端執行階段以請求簽署的憑證,並確保用戶端信任簽署此憑證的憑證授權單位。

Procedure配置用戶端執行階段以請求簽署的憑證

  1. 將連線工廠的 imqSSLIsHostTrusted 屬性設定為 false

    依預設,用戶端將用來建立代理程式連線的連線工廠物件之 imqSSLIsHostTrusted 屬性設定為 true,這表示用戶端執行階段會接受所出示的任何憑證。您必須將此值變更為 false,讓用戶端執行階段嘗試驗證所出示的所有憑證。如果憑證簽署者未出現在用戶端的信任清單存放區,驗證便會失敗。

  2. 驗證簽署的授權單位是否已在用戶端的信任清單存放區中註冊。

    若要測試用戶端是否會接受您的憑證授權單位所簽署的憑證,請嘗試建立 SSL 連線,如上節配置並執行 SSL 型用戶端中所述。如果 CA 列在用戶端的信任存放區中,連線便會成功,您可以跳過下一個步驟。如果連線失敗出現憑證驗證錯誤,請執行下一個步驟。

  3. 在用戶端的信任存放區中安裝簽署 CA 的根憑證。

    依預設,用戶端會搜尋金鑰庫檔案 cacertsjssecacerts,因此如果憑證安裝在以上其中一個檔案中,便不需要進一步配置。下列範例會將來自 Verisign 憑證授權單位,檔名為 testrootca.cer 的測試根憑證檔案,安裝到預設系統憑證檔案 cacerts 。此範例假設 J2SE 安裝在 $JAVA_HOME/usr/j2se 目錄中:

    keytool -import -keystore /usr/j2se/jre/lib/security/cacerts
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    建議使用的替代選項,是將根憑證安裝到替代系統憑證檔案 jssecacerts

    keytool -import -keystore /usr/j2se/jre/lib/security/jssecacerts
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    第三個可能方法是將根憑證安裝到其他金鑰庫檔案中,並且配置用戶端將其視為信任存放區。下列範例會安裝到 /home/smith/.keystore 檔案中:

    keytool -import -keystore /home/smith/.keystore
            -alias VerisignTestCA -file testrootca.cer -noprompt
            -trustcacerts -storepass myStorePassword
    

    由於用戶端依預設不會搜尋此金鑰庫,因此您必須明確向用戶端提供此位置作為信任存放區。若要執行這項操作,請在用戶端執行時,設定 Java 系統特性 javax.net.ssl.trustStore

    javax.net.ssl.trustStore=/home/smith/.keystore