![]() |
Sun ONE Message Queue, Version 3.0.1 管理員指南 |
本章介紹如何執行與安全性相關的工作,其中包括認證、授權和加密。
認證使用者 您負責維護使用者儲存庫中的使用者、使用者群組以及密碼清單。本章的第一部分介紹如何建立、移入和管理使用者儲存庫。如需 Sun ONE Message Queue (MQ) 安全性的介紹,請參閱安全性管理程式。
授權使用者 您負責編輯屬性檔案,此屬性檔案將使用者對代理程式作業的存取權對映至使用者的名稱或群組。本章的第二部分介紹如何自訂此屬性檔案。
加密:設定 SSL 服務 使用基於安全套接層 (SSL) 標準的連線服務,可讓您加密在用戶端與代理程式之間傳送的訊息。如需 MQ 如何處理加密的介紹,請參閱加密 (企業版)。本章的最後一部分介紹如何設定基於 SSL 的連線服務,並提供有關使用 SSL 的其他資訊。
對於代理程式安全存取 SSL 鍵值儲存區、LDAP 使用者儲存庫或 JDBC 相容永久性儲存區所需的密碼,有三種方法可提供此類密碼:認證使用者
當使用者嘗試連線至代理程式時,此代理程式將透過檢查提供的名稱和密碼認證此使用者,如果名稱和密碼與系統配置此代理程式要參考的使用者儲存庫中的名稱和密碼相符,則代理程式承認此連線。此儲存庫有兩種類型:
- MQ 隨附的文字檔案儲存庫
這種類型的使用者儲存庫非常易於使用;但是其安全性易受侵害,因此應僅將其用於評估與開發。您可以使用使用者管理員公用程式 (imqusermgr) 移入和管理此儲存庫。若要啟用認證,您應移入包含每個使用者名稱、密碼以及使用者群組名稱的使用者儲存庫。
如需有關設定與管理使用者儲存庫的更多資訊,請參閱使用文字檔案使用者儲存庫。
- LDAP 伺服器
這可以是現有或新的 LDAP 目錄伺服器,它將 LDAP v2 或 v3 協定用於使用者儲存庫。它不如文字檔案儲存庫易於使用,但是它很安全,因此更適用於生產環境。
如果您要使用 LDAP 使用者儲存庫,則將需要使用 LDAP 供應商提供的工具來移入和管理此使用者儲存庫。如需更多資訊,請參閱將 LDAP 伺服器用於使用者儲存庫。
使用文字檔案使用者儲存庫
MQ 提供了文字檔案使用者儲存庫和指令行工具,即 MQ 使用者管理員 (imqusermgr),您可以使用此工具移入和管理文字檔案使用者儲存庫。 以下各節描述了文字檔案使用者儲存庫、其初始項目以及如何移入和管理此儲存庫。
預設文字檔案儲存庫位於:
IMQ_HOME/etc/passwd (在 Solaris 上為 /etc/imq/passwd)
此儲存庫隨附兩個已定義的項目 (列),如下表中所述。
表格 8-1    使用者儲存庫中的初始項目
使用者名稱
密碼
群組
狀態
admin
admin
admin
active
guest
guest
anonymous
active
這些初始項目可讓 MQ 代理程式在安裝之後立即使用,而無需管理員的介入。換言之,要使用的 MQ 代理程式無需初始使用者/密碼設定。
初始 guest 使用者項目可讓 JMS 用戶端使用預設 guest 使用者名稱和密碼連線至代理程式 (例如用於測試)。
初始 admin 使用者項目可讓您使用 imqcmd 指令並使用預設 admin 使用者名稱和密碼來管理代理程式。我們建議您更新此初始項目以變更密碼。
您可以使用使用者管理員公用程式編輯或移入文字檔案使用者儲存庫,而不必先配置或啟動代理程式。使用使用者管理員公用程式的唯一要求是,要在已安裝代理程式的主機上執行它,並且如果您要向儲存庫中寫入,則必須擁有適當的許可權:
- 在 Solaris 上,使用者管理員公用程式可由超級使用者執行,或者由透過基於存取控制的 Solaris 角色授予存取權的其他非超級使用者執行。若要授予此類存取權,超級使用者必須將 /etc/user_attr 的項目變成以下形式:
使用者名稱::::type=normal;profiles=Message Queue Management
這可將指定的使用者新增至 MQ 權限設定檔。若要使用此功能,您必須先執行設定檔 shell (pfsh、pfksh 和 pfcsh),例如,
% /usr/bin/pfsh
然後執行需要的使用者管理員 (imqusermgr) 指令。
如需有關基於存取控制的 Solaris 角色的更多資訊,請參閱:http://docs.sun.com/
?q=Rights+Profile&p=/doc/806-4078/6jd6cjrvl&a=view)。
- 在 Windows 上,安裝之後,使用者儲存庫檔案可由任何使用者寫入,因為作業系統不控制對使用基於使用者名稱的許可權屬性之檔案的存取。
以下各節介紹如何移入和管理文字檔案使用者儲存庫。
使用者管理員公用程式 (imqusermgr)
使用者管理員公用程式可讓您管理基於檔案的使用者儲存庫。本節描述基本的 imqusermgr 指令語法、提供子指令的清單,並總結 imqusermgr 指令選項。後續各節介紹如何使用 imqobjmgr 子指令完成特定的工作。
指令的語法
imqusermgr 指令的一般語法如下:
imqusermgr subcommand [options]
imqusermgr -h
imqusermgr -v請注意,如果您指定 -v 或 -h 選項,則系統不會執行指令行上指定的子指令。例如,如果您輸入以下指令,則系統會顯示版本資訊但不會執行 list 子指令。
imqusermgr list -v
imqusermgr 子指令
表格 8-2 列出了 imqusermgr 子指令。
imqusermgr 指令選項摘要
表格 8-3 列出了 imqusermgr 指令的選項。
群組
當將使用者項目新增至儲存庫時,管理員可以為此使用者選擇指定預先定義的三個群組之一:admin、user 或 anonymous。如果未指定群組,則指定預設群組 user。
- admin 群組用於代理程式管理員。依預設,已指定此群組的使用者可以配置和管理代理程式。管理員可以將多個使用者指定給 admin 群組。
- user 群組用於普通 (非管理) JMS 用戶端應用程式。大多數 MQ 用戶端應用程式將存取已在 user 群組中認證的代理程式。依預設,用戶端應用程式本身可以向所有主題與佇列生產訊息,以及使用來自所有主題與佇列的訊息,或者瀏覽任何佇列中的訊息。
- anonymous 群組用於 JMS 用戶端應用程式,這些應用程式不想使用代理程式知道的使用者名稱 (可能因為應用程式不知道要使用的實際使用者名稱)。這對於大多數 FTP 伺服器中存在的匿名帳號均類似。每次管理員僅可以將一個使用者指定給 anonymous 群組。預計您將透過存取控制限制此群組的存取權限 (與 user 群組相比較),或者您將在佈署時從此群組中移除使用者。
為了變更使用者的群組,管理員必須刪除使用者項目並為此使用者新增其他項目,從而指定新的群組。
您可以指定定義群組成員可執行之作業的存取規則。如需更多資訊,請參閱授權使用者:存取控制屬性檔案。
狀態
當管理員將使用者新增至儲存庫之後,此使用者的狀態依預設為作用中。若要讓此使用者變成非作用中,管理員必須使用更新指令。例如,以下指令讓使用者 JoeD 狀態變成非作用中:
imqusermgr update -u JoeD -a false
已變成非作用中使用者的項目保留在儲存庫中;但是,非作用中使用者無法開啟新的連線。如果使用者為非作用中,並且管理員新增具有相同名稱的其他使用者,則作業將失敗。管理員必須刪除非作用中使用者項目或變更新使用者的名稱,或者為新使用者使用其他名稱。這樣可避免管理員新增重複名稱或密碼。
使用者名稱與密碼的格式
使用者名稱與密碼必須遵循以下原則:
- 使用者名稱與密碼不能包含表格 8-4 中所列字元。
表格 8-4    無效的使用者名稱與密碼字元
字元
描述
*
星號
,
逗號
:
冒號
- 使用者名稱與密碼不能包含新行或換行鍵作為字元。
- 如果名稱或密碼包含空格,則必須將整個名稱或密碼括在引號內。
- 名稱或密碼必須至少包含一個字元。
- 密碼或使用者名稱的長度沒有限制,除非指令 shell 對指令行上可輸入字元的最大數量強加限制。
移入和管理使用者儲存庫
使用 add 子指令可將使用者新增至儲存庫。例如,以下指令新增使用者 Katharine 和密碼 sesame。
imqusermgr add -u Katharine -p sesame -g user
使用 delete 子指令可從儲存庫中刪除使用者。例如,以下指令刪除使用者 Bob:
imqusermgr delete -u Bob
使用 update 子指令可變更使用者的密碼或狀態。例如,以下指令將 Katharine 的密碼變更為 alladin:
imqusermgr update -u Katharine -p alladin
若要列出有關一個或多個使用者的資訊,請使用 list 指令。以下指令顯示有關名為 isa 的使用者之資訊:
imqusermgr list -u isa
----------------------------------
User Name Group Active State
----------------------------------
isa admin true
以下指令列出有關所有使用者的資訊:
imqusermgr list
--------------------------------------
User Name Group Active State
--------------------------------------
testuser3 user true
testuser2 user true
testuser1 user true
isa admin true
admin admin true
guest anonymous true
testuser5 user false
testuser4 user false
變更預設管理員密碼
為了安全性,您必須將 admin 的預設密碼變更為只有您自己知道的密碼。您需要使用 imqusermgr 工具來完成此作業。
以下指令將預設密碼變更為 grandpoobah。
imqusermgr update -u admin -p grandpoobah
當代理程式正在執行時,您可以透過執行任一指令行工具來快速確認此變更生效。例如,以下指令應生效,
imqcmd list svc -u admin -p grandpoobah
而使用舊密碼應失敗。
變更密碼之後,使用任一管理工具 (包括管理主控台) 時,您均應提供新密碼。
將 LDAP 伺服器用於使用者儲存庫
如果您要將 LDAP 伺服器用於使用者儲存庫,則必須在實例配置檔案中設定某些代理程式屬性。當使用者嘗試連線至代理程式或執行某些作業時,這些屬性可讓代理程式查詢 LDAP 伺服器以獲得有關使用者和群組的資訊。實例配置檔案位於
IMQ_VARHOME/instances/brokerName/props/config.properties
(在 Solaris 上為 /var/imq/instances/brokerName/props/config.properties)編輯配置檔案以使用 LDAP 伺服器
- 透過設定以下屬性指定您要使用 LDAP 使用者儲存庫:
imq.authentication.basic.user_repository=ldap
- 設定 imq.authentication.type 屬性,以確定密碼應以基本 64 編碼 (basic) 還是以 MD5 摘要 (digest) 從用戶端傳送至代理程式。當將 LDAP 目錄伺服器用於使用者儲存庫時,您必須將認證類型設定為 basic。例如,
imq.authentication.type=basic
- 您還必須設定可控制 LDAP 存取的代理程式屬性。這些屬性儲存在代理程式的實例配置文件中,在表格 8-5 中有描述。MQ 使用 JNDI API 與 LDAP 目錄伺服器通訊。請參閱 JNDI 說明文件,以獲得有關這些屬性中所參考之語法與術語的更多資訊。MQ 3.0.1 使用 Sun JNDI LDAP 供應程式並使用簡單認證。
表格 8-5    與 LDAP 相關的屬性
屬性
描述
imq.user_repository.
ldap.server
用於 LDAP 伺服器的主機:連接埠。主機指定執行目錄伺服器之主機的完全合格的 DNS 名稱。連接埠指定目錄伺服器用於通訊的連接埠號。
imq.user_repository.
ldap.principal
識別名稱,代理程式將使用此名稱連結至目錄伺服器以進行搜尋。如果目錄伺服器允許匿名搜尋,則無需為此屬性指定值。
imq.user_repository.
ldap.password
與代理程式所用識別名稱相關聯的密碼。僅能在密碼檔案中指定 (請參閱使用密碼檔案)。如需更高安全性,請讓代理程式提示您提供密碼,或使用以下指令行選項指定密碼:imqbrokerd -ldappassword。
如果目錄伺服器允許匿名搜尋,則無需密碼。
imq.user_repository.
ldap.base
用於使用者項目的目錄庫。
imq.user_repository.
ldap.uidattr
供應程式特定的屬性識別碼,其值可唯一識別使用者。例如:uid 和 cn 等。
imq.user_repository.
ldap.usrfilter
JNDI 搜尋過濾器 (表示為邏輯表示式的搜尋查詢)。透過為使用者指定搜尋過濾器,代理程式可以縮小搜尋範圍以便提高效率。如需更多資訊,請參閱位於以下位置的 JNDI 指導:http://java.sun.com/products/jndi/tutorial。
此屬性可不必設定。
imq.user_repository.
ldap.grpsearch
指定您是否要啟用群組搜尋的布林。請參閱您的 LDAP 供應商提供的說明文件,以確定您是否可以將使用者與群組相關聯。
請注意,MQ 3.0.1 中不支援巢式群組。
預設:false。
imq.user_repository.
ldap.grpbase
用於群組項目的目錄庫。
imq.user_repository.
ldap.gidattr
供應程式特定的屬性識別碼,其值為群組名稱。
imq.user_repository.
ldap.memattr
群組項目中的屬性識別碼,其值為群組成員的識別名稱。
imq.user_repository.
ldap.grpfiltler
JNDI 搜尋過濾器 (表示為邏輯表示式的搜尋查詢)。透過為群組指定搜尋過濾器,代理程式可以縮小搜尋範圍以便提高效率。如需更多資訊,請參閱位於以下位置的 JNDI 指導。
http://java.sun.com/products/
jndi/tutorial此屬性可不必設定。
imq.user_repository.
ldap.timeout
指定搜尋時間限制的整數 (以秒為單位)。依預設可設定為 180 秒。
imq.user_repository.
ldap.ssl.enabled
指定代理程式與 LDAP 通訊時是否應使用 SSL 協定的布林。依預設可設定為 false。
請參閱代理程式的 default.properties 檔案,以獲得與 LDAP 使用者儲存庫相關的屬性設定範例 (預設)。
- 如有必要,您需要編輯存取控制屬性檔案中的使用者/群組和規則。如需有關使用存取控制屬性檔案的更多資訊,請參閱授權使用者:存取控制屬性檔案。
- 如果在連線認證和群組搜尋期間,您要讓代理程式透過 SSL 與 LDAP 目錄伺服器通訊,則需要啟動 LDAP 伺服器中的 SSL,然後在代理程式配置檔案中設定以下屬性:
為 LDAP 使用者儲存庫屬性指定安全連接埠。例如:
imq.user_repository.ldap.server=myhost:7878
將代理程式的 property imq.user_repository.ldap.ssl.enabled
設定為 true。授權使用者:
存取控制屬性檔案
連線至代理程式之後,使用者可能要生產訊息、使用目標上的訊息,或瀏覽佇列目標上的訊息。當使用者嘗試上述作業時,代理程式將檢查存取控制屬性檔案 (ACL 檔案) 以查看此使用者是否已被授權執行此作業。ACL 檔案包含的規則可指定特定使用者 (或使用者群組) 已被授權執行哪些作業。依預設,允許所有認證使用者在任何目標上生產和使用訊息。您可以編輯存取控制屬性檔案,以限制某些使用者和群組執行這些作業。
無論使用者資訊放在文字檔案儲存庫中還是放在 LDAP 儲存庫中,均可使用 ACL 檔案。預設 ACL 屬性檔案將與代理程式一同安裝。此檔案名稱為 accesscontrol.properties,並由安裝程式放在以下目錄中:
IMQ_HOME/etc (在 Solaris 上為 /etc/imq)
ACL 檔案的格式與 Java 屬性檔案的格式類似。它的開始部分定義檔案的版本,然後分三部分指定存取控制規則:
- 連線存取控制
- 目標存取控制
- 目標自動建立存取控制
version 屬性定義 ACL 屬性檔案的版本;您不能變更此項目。
version=JMQFileAccessControlModel/100
以下描述存取規則的基本語法並介紹如何計算許可權,並且還描述指定存取控制的 ACL 檔案的三個部分。
存取規則語法
在 ACL 屬性檔案中,存取控制定義了特定使用者或群組對受保護的資源 (如目標和連線服務) 擁有何種存取權。存取控制由一條規則或一組規則表示,每條規則用一個 Java 屬性表示:
這些規則的基本語法如下:
resourceType.resourceVariant.operation.access.principalType = principals
表格 8-6 描述了語法規則的元素。
表格 8-6    存取規則的語法元素
元素
描述
resourceType
為以下之一:connection、queue 或 topic。
resourceVaria nt
resourceType 指定的類型實例。例如,myQueue。萬用字元符號 (*) 可用於表示所有連線服務類型或所有目標。
operation
值取決於要制定的存取規則種類。
access
為以下之一:allow 或 deny。
principalType
為以下之一:user 或 group。如需更多資訊,請參閱群組。
principals
可以擁有在規則左側指定的存取權的使用者。如果 principalType 為 user,則此項可以為個別使用者或使用者清單 (以逗號分隔);如果 principalType 為 group,則此項可以為單一群組或群組清單 (以逗號分隔的清單)。萬用字元符號 (*) 可用於表示所有使用者或所有群組。
以下為存取規則的一些範例:
- 以下規則表示所有使用者均可以將訊息傳送至名為 q1 的佇列。
queue.q1.produce.allow.user=*
- 以下規則表示任何使用者均可以將訊息傳送至任何佇列。
queue.*.produce.allow.user=*
註 若要指定非 ASCII 的使用者、群組或目標名稱,您必須使用統一碼退出符號 (\uXXXX) 表示法。如果您已經編輯並儲存具有非 ASCII 編碼名稱的 ACL 檔案,則可以使用 Java native2ascii 工具將其轉換為 ASCII。如需更加詳細的資訊,請參閱 http://java.sun.com/j2se/1.3/docs/guide/intl/faq.html
許可權運算
當運算一系列規則所包含的許可權時,可套用以下原則:
- 特定存取規則置換一般存取規則。套用以下兩條規則之後,所有使用者均可以將訊息傳送至所有佇列,但是 Bob 卻無法將訊息傳送至 tq1。
queue.*.produce.allow.user=*
queue.tq1.produce.deny.user=Bob
- 賦予明確 principal 的存取權置換賦予 * principal 的存取權。以下規則拒絕 Bob 向 tq1 生產訊息,但允許其他所有使用者向 tq1 生產訊息。
queue.tq1.produce.allow.user=*
queue.tq1.produce.deny.user=Bob
- 用於使用者的 * principal 規則置換用於群組的相應 * principal 規則。例如,以下兩條規則允許所有認證使用者將訊息傳送至 tq1。
queue.tq1.produce.allow.user=*
queue.tq1.produce.deny.group=*
- 授予使用者的存取權置換授予使用者群組的存取權。在以下範例中,如果 Bob 為 User 成員,則他將被拒絕向 tq1 生產訊息,但是 User 的所有其他成員均可以向 tq1 生產訊息。
queue.tq1.produce.allow.group=User
queue.tq1.produce.deny.user=Bob
- 任何未透過存取規則明確授予的存取許可權,都會被默認拒絕。例如,如果 ACL 檔案不包含存取規則,則所有使用者均被拒絕所有作業。
- 相同使用者或群組的拒絕和允許許可權會相互抵銷。例如,以下兩條規則導致 Bob 無法瀏覽 t1:
queue.q1.browse.allow.user=Bob
queue.q1.browse.deny.user=Bob
以下兩條規則導致群組 User 無法使用 q5 上的訊息。
queue.q5.consume.allow.group=User
queue.q5.consume.deny.group=User
- 當存在多條相同的左側規則時,只有最後一項生效。
連線存取控制
ACL 屬性檔案中的連線存取控制部分,包含用於代理程式連線服務的存取控制規則。連線存取控制規則的語法如下:
connection.resourceVariant.access.principalType = principals
resourceVariant 定義有兩個值:NORMAL 與 ADMIN。依預設,所有使用者對 NORMAL 類型連線服務擁有存取權,但是只有那些群組為 admin 的使用者才對 ADMIN 類型連線服務擁有存取權。
您可以編輯連線存取控制規則,以限制使用者的連線存取權限。例如,以下規則拒絕 Bob 存取 NORMAL,但是允許其他所有使用者進行存取:
connection.NORMAL.deny.user=Bob
connection.NORMAL.allow.user=*
您可以使用星號 (*) 字元來指定所有認證使用者或群組。
您不能建立自己的服務類型;您必須將自己限制於由常數 NORMAL 與 ADMIN 所指定的預先定義類型之內。
目標存取控制
存取控制屬性檔案的目標存取控制部分,包含基於目標的存取控制規則。這些規則確定何人 (使用者/群組) 可以在何處 (目標) 做什麼 (作業)。這些規則所規定的存取權類型包括:將訊息傳送至佇列、將訊息出版至主題、接收來自佇列的訊息、訂閱主題以及瀏覽佇列中的訊息。
依預設,任何使用者或群組對任何目標擁有所有類型的存取權。您可以新增多條特定的目標存取規則,或編輯預設規則。本節的其餘部分介紹目標存取規則的語法,您必須理解此語法以編寫自己的規則。
目標規則的語法如下:
resourceType.resourceVariant.operation.access.principalType = principals
表格 8-7 描述了這些元素:
存取權可以賦予一個或多個使用者和/或一個或多個群組。
以下範例說明了不同種類的目標存取控制規則:
- 允許所有使用者將訊息傳送至任何佇列目標。
queue.*.produce.allow.user=*
- 拒絕群組 user 的任何成員訂閱主題 Admissions。
topic.Admissions.consume.deny.group=user
目標自動建立存取控制
ACL 屬性檔案的最後部分,包括指定代理程式將為哪些使用者和群組自動建立目標的存取規則。
當使用者在並不存在的目標上建立生產者或使用者時,如果代理程式的自動建立屬性已啟用且實體目標尚未存在,則代理程式將建立此目標。
依預設,任何使用者或群組均有權讓代理程式自動建立目標。此權限由以下規則指定:
queue.create.allow.user=*
topic.create.allow.user=*
您可以編輯 ACL 檔案以限制此類型的存取權。
目標自動建立存取規則的一般語法如下:
resourceType.create.access.principalType = principals
其中 resourceType 為 queue 或 topic。
例如,以下規則可讓代理程式為除 Snoopy 之外的所有使用者自動建立主題目標。
topic.create.allow.user=*
topic.create.deny.user=Snoopy
請注意,目標自動建立規則的效果必須與目標存取規則的效果一致。例如,如果您 1) 變更目標存取規則,以禁止任何使用者將訊息傳送至目標,但是 2) 啟用目標的自動建立功能,如果此目標不存在,則代理程式將會建立此目標,但不會將訊息遞送至此目標。
加密:使用 SSL 服務 (企業版)
MQ 企業版支援基於安全套接層 (SSL) 標準的連線服務:透過 TCP/IP (ssljms 與 ssladmin) 和透過 HTTP (httpsjms)。這些基於 SSL 的連線服務允許加密在用戶端與代理程式之間傳送的訊息。目前的 MQ 版次支援基於自身簽名伺服器證書的 SSL 加密。
若要使用基於 SSL 的連線服務,您需要使用鍵值工具公用程式 (imqkeytool) 產生私密密鑰/公開密鑰對。此公用程式將公開密鑰內嵌於自身簽名的證書中,此證書被傳送至請求與代理程式連線的用戶端,此用戶端使用此證書設定加密連線。
雖然 MQ 的基於 SSL 的連線服務在概念上相似,但是在設定方法上卻有些差異。因此,以下各節分別說明透過 TCP/IP 和 HTTP 的安全連線。
設定透過 TCP/IP 的 SSL 服務
兩種基於 SSL 的連線服務可提供透過 TCP/IP 的直接而安全的連線。
ssljms 此連線服務用於在用戶端與代理程式之間,透過安全而加密的連線遞送 JMS 訊息。
ssladmin 此連線服務用於在指令公用程式 (imqcmd) 這種指令行管理工具與代理程式之間建立安全而加密的連線。管理主控台 (imqadmin) 不支援安全連線。
設定 ssljms 連線服務
除步驟 4 (配置並執行用戶端) 之外,設定 ssljms 連線服務的程序與設定 ssladmin 連線服務的程序相同。
- 產生自身簽名的證書。
- 啟用代理程式中的 ssljms 連線服務。
- 啟動代理程式。
- 配置並執行用戶端。
以下各節較詳細地說明每個步驟。
步驟 1. 產生自身簽名的證書
在假設用戶端正與已知且可信任的伺服器通訊的情況下,MQ 3.0.1 中的 SSL 支援可保護線上資料。因此在 MQ 3.0.1 中,僅使用自身簽名的證書即可實施 SSL。
執行 imqkeytool 指令,以便為代理程式產生自身簽名的證書。ssljms 和 ssladmin 連線服務可使用相同的證書。在指令提示符號下輸入以下內容:
imqkeytool -broker
此公用程式將提示您提供它所需的資訊。(在 Unix 系統上,為了擁有建立鍵值儲存區的許可權,您可能需要以超級使用者 [root] 的身份執行 imqkeytool。)
首先,imqkeytool 提示您提供鍵值儲存區密碼以及某些組織資訊,然後提示您確認。接收到確認之後,它會在產生鍵對時暫停。然後它會要求您提供密碼,以鎖定特定的鍵對 (鍵密碼);您應輸入 [Return] 以回應此提示:這會使鍵密碼與鍵值儲存區密碼相同。
註 請記住您所提供的密碼,稍後您需要將此密碼提供給代理程式 (當您啟動它時),以便代理程式可開啟鍵值儲存區。您還可以將鍵值儲存區密碼儲存在密碼檔案中 (請參閱使用密碼檔案)。
執行 imqkeytool 可執行 JDK keytool 公用程式,以產生自身簽名的證書並將其放在 MQ 的鍵值儲存區中,此儲存區位於
IMQ_HOME/etc/keystore (在 Solaris 上為 /etc/imq/keystore)
此鍵值儲存區的格式與 JDK1.2 keytool 公用程式支援的格式相同。
MQ 鍵值儲存區的可配置屬性如表格 8-8 中所示。(如需有關配置這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」)
表格 8-8    鍵值儲存區屬性
屬性名稱
描述
imq.keystore.file.
dirpath
用於基於 SSL 的服務:指定包含鍵值儲存區檔案之目錄的路徑。
預設:IMQ_HOME/etc (在 Solaris 上為 /etc/imq/)imq.keystore.file.name
用於基於 SSL 的服務:指定鍵值儲存區檔案的名稱。
預設:keystoreimq.keystore.password
用於基於 SSL 的服務:指定鍵值儲存區密碼。僅能儲存在密碼檔案中 (請參閱使用密碼檔案)。如需更高安全性,請讓代理程式提示您提供密碼,或使用以下指令行選項指定密碼:imqbrokerd -password。
您可能需要重新產生鍵對以解決某些問題;例如:
- 您忘記了鍵值儲存區密碼。
- 啟動代理程式時 SSL 服務無法初始化,並且您收到以下異常:
java.security.UnrecoverableKeyException:Cannot recover key.
可能導致此異常的原因為,您提供的鍵密碼與您在步驟 1. 產生自身簽名的證書中產生自身簽名證書時的鍵值儲存區密碼不同。
重新產生鍵對
- 移除位於以下位置的代理程式的鍵值儲存區:
IMQ_HOME/etc/keystore (在 Solaris 上為 /etc/imq/keystore)
- 重新執行 imqkeytool 以產生鍵對,如步驟 1. 產生自身簽名的證書中所述。
步驟 2. 啟用代理程式中基於 SSL 的服務
若要啟用代理程式中的 SSL 服務,您需要將 ssljms (ssladmin) 新增至 imq.service.activelist 屬性。
- 開啟代理程式的實例配置檔案。您可以在以下位置找到它:
IMQ_VARHOME/instances/brokerName/props/config.properties
(在 Solaris 上為 /var/imq/instances/brokerName/props/config.properties)其中 brokerName 為代理程式實例的名稱。
- 將 ssljms 或 ssladmin 值或二者的值 (取決於您需要的服務) 新增至 imq.service.activelist 屬性:
imq.service.activelist=jms,admin,httpjms,ssljms, ssladmin
步驟 3. 啟動代理程式
啟動代理程式,提供鍵值儲存區密碼。您可以用以下任何一種方法提供密碼:
- 當代理程式啟動時讓它提示您提供密碼
imqbrokerd
Please enter Keystore password:我的密碼
- 使用 imqbrokerd 指令的 -password 選項:
imqbrokerd -password 我的密碼
- 將密碼放在密碼檔案中 (請參閱使用密碼檔案),代理程式啟動時將存取此檔案。您必須先設定以下代理程式配置屬性 (請參閱編輯實例配置檔案):
imq.passfile.enabled=true
一旦設定此屬性,您便可以用以下兩種方法之一存取密碼檔案:
將密碼檔案的位置傳送給 imqbrokerd 指令:
imqbrokerd -passfile /tmp/mypassfile
啟動不帶 -passfile 選項的代理程式,但使用以下兩個代理程式配置屬性指定密碼檔案的位置:
imq.passfile.dirpath=/tmp
imq.passfile.name=mypassfile
如需與密碼檔案相關的代理程式屬性的清單,請參閱表格 2-6。
當您啟動具有 SSL 的代理程式或用戶端時,您可能會注意到它消耗了很多 CPU 週期,長達幾秒鐘。這是因為 MQ 使用 JSSE (Java 安全套接延伸) 以實施 SSL。JSSE 使用 java.security.SecureRandom() 產生隨機數字。此方法建立初始隨機數種子要佔用大量時間,這就是您所看到 CPU 使用率增加的原因。建立種子之後,CPU 使用率會降至正常。
步驟 4. 配置並執行基於 SSL 的用戶端
最後,您需要將用戶端配置為使用安全連線服務。依據您使用的連線服務,有兩種類型的用戶端:使用 ssljms 的 JMS 用戶端和使用 ssladmin 的 MQ 管理指令公用程式 (imqcmd)。這兩種用戶端將在以下各節中分別描述。
JMS 用戶端
您必須確保用戶端在其類別路徑中擁有必要的安全套接延伸 (JSSE) JAR 檔案,而且您需要告知用戶端使用 ssljms 連線服務。
- 如果您的用戶端未使用 J2SDK1.4 (具有內建的 JSSE 與 JNDI 支援),請確保用戶端在其類別路徑中擁有以下 JAR 檔案:
jsse.jar、jnet.jar、jcert.jar 和 jndi.jar
- 確保用戶端在其類別路徑中擁有以下 MQ JAR 檔案:
imq.jar 和 jms.jar
- 啟動用戶端並將其連線至代理程式的 ssljms 服務。完成此作業的方法之一是輸入以下指令:
java -DimqConnectionType=TLS clientAppName
設定 imqConnectionType 可告知連線使用 SSL。
如需有關在用戶端應用程式中使用 ssljms 連線服務的更多資訊,請參閱「MQ Developer's Guide」中有關使用受管理物件的章節。
指令公用程式 (imqcmd)
您可以透過使用 imqcmd (請參閱表格 6-2) 時包括 -secure 選項,建立安全管理連線,例如:
imqcmd list svc -b hostName:port -u adminName -p adminPassword -secure
其中adminName和adminPassword為 MQ 使用者儲存庫中的有效項目 (如果使用文字檔案儲存庫,請參閱變更預設管理員密碼)。
列出連線服務 (如在此範例中) 是顯示 ssladmin 服務正在執行的一種方法,也是您可以成功地建立安全 admin 連線的一種方法,如以下輸出中所示:
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.
設定透過 HTTP 的 SSL 服務
在此基於 SSL 的連線服務 (httpsjms) 中,用戶端和代理程式藉由 HTTPS 通道 Servlet 建立安全連線。附錄 B 「HTTP/HTTPS 支援 (企業版)」中描述了 HTTPS 支援的架構與實施。
使用密碼檔案
當您想讓代理程式啟動而不提示您提供所需密碼,或不要求您將這些密碼作為 imqbrokerd 指令的選項提供時,您可以將所需密碼放在密碼檔案中。
密碼檔案為包含密碼的簡單文字檔。此檔案未加密,因此不如手動提供密碼安全。然而,您可以設定此檔案的許可權,限制何人有權檢視它。密碼檔案的許可權需要賦予啟動代理程式的使用者讀取它的許可權。
密碼檔案可以包含表格 8-9 中所示密碼:
密碼檔案範例可在以下位置找到:
IMQ_HOME/etc/passfile.sample (在 Solaris 上為 /etc/imq/passfile.sample)