Web Services Security 的簽名流

CloudSpace發表於2008-07-29

設定 Web Services Security (WS-Security) 來對應用程式與 IBM® WebSphere® Message Broker 之間傳送和接收的資料進行簽名。本文描述基本概念、如何設定環境和如何配置 WebSphere Message Broker 來對資料簽名。這裡提供的資訊與平臺和作業系統無關,但是您可以在適當的地方看到特定作業系統的示例。本文結尾處關於術語的部分將幫助闡明本文所描述的概念。

什麼是簽名?

首先,讓我們看看與簽名有關的一些重要概念的定義:

  • 簽名提供訊息完整性和簽名者身份驗證。
  • 訊息完整性確保訊息未被修改。
  • 簽名者身份驗證(也稱為數字簽名)確保訊息傳送者的身份是有效的。
  • 金鑰用於對訊息簽名。
  • 證照用於驗證訊息的內容。
  • 金鑰儲存庫儲存這些證照和金鑰。

可以使用工具來設定金鑰儲存庫,例如 WebSphere Message Broker Java™ Runtime Environment (JRE) 元件中的工具 keytooliKeyman。您必須提供有關您在何處建立了金鑰儲存庫的資訊,這樣 WebSphere Message Broker 才能使用它們來完成簽名過程。

您還需要定義 WebSphere Message Broker 策略,以告訴系統是否正在使用簽名或加密,以及哪一端在執行簽名或加密。然後將該策略與某個繫結相關聯,此繫結將該策略繫結到 WebSphere Message Broker 的流。該繫結從 WS-Security 簽名的角度告訴 WebSphere Message Broker 如何處理傳入和傳出訊息。

金鑰儲存庫

如上所述,金鑰儲存庫是用於儲存證照和金鑰條目的儲存庫。雖然似乎有點混淆,但是存在兩種型別的金鑰儲存庫,它們僅在使用方式方面存在區別:

  • 金鑰儲存庫:可以在金鑰儲存庫中放置所有的私鑰和公鑰證照 (PKC)。
  • 信任儲存庫:可以在信任儲存庫中放置所有受信任的根證照頒發機構(certificate authority,CA)證照。這些證照用於建立任何入站 PKC 的信任關係。信任儲存庫通常僅包含公鑰。

可以定義金鑰儲存庫和信任儲存庫以應用於 WebSphere Message Broker 或應用於 WebSphere Message Broker 上的某個執行組。有關這方面的更多詳細資訊,請訪問 WebSphere Message Broker 資訊中心(請參閱參考資料以獲取連結)。稍後您可以在本文中看到示例。

金鑰儲存庫包含以下條目:

  • 金鑰儲存庫——金鑰條目:這種型別的金鑰儲存庫條目包含非常敏感的加密金鑰資訊,該資訊以受保護的格式儲存以防止未經授權的訪問。通常,儲存在此類條目中的金鑰是對對應的公鑰進行身份驗證的證照鏈所附帶的私鑰。
  • 信任儲存庫——受信任的證照條目:這種型別的條目包含單個屬於另一方的 PKC。將其稱為受信任的證照的原因在於,金鑰儲存庫所有者信任該證照中的公鑰的確屬於由該證照的主體(所有者)所標識的身份。此類條目可用於對其他方進行身份驗證。

WebSphere Message Broker 僅支援將 Java 金鑰儲存庫(Java keystore,JKS)用於金鑰儲存庫和信任儲存庫。

設定金鑰儲存庫

設定金鑰儲存庫的最快方法是建立您自己的證照,稱為自簽名證照。您最終將獲得包含公開證照和私鑰的金鑰儲存庫。要設定信任儲存庫,您需要匯出公開證照並將其匯入新的信任儲存庫。信任儲存庫通常僅包含公開證照。

當 WebSphere Message Broker 接收到訊息時,除非設定了選項 Trustany,否則將根據信任儲存庫中的證照來驗證訊息中的證照。您可以在圖 17 中看到此選項,其中將信任設定為 TrustStore

WebSphere Message Broker 提供的 keytool 實用工具或 iKeyman 實用工具對金鑰儲存庫進行管理。

建立自簽名證照

下面使用 iKeyman V7.0.3.28 來逐步地建立一個自簽名的證照以便分發到伺服器。

  1. 從命令列視窗中(例如在 Microsoft® Windows® 命令提示符中)執行 iKeyman。IBM Key Management 視窗將開啟。
  2. 單擊 New > Self-Signed Certificate 並按照提示操作。
  3. 通過從下拉選單中選擇 Personal Certificates(請參見圖 1)來獲取新的自簽名證照的公開位,其中同時包含私有和公開部分。

    圖 1. Personal Certificates 檢視
    Personal Certificates 檢視

  4. 選擇您新建立的證照。
  5. 單擊 Extract Certificate,如圖 1 所示,以開啟 Extract Certificate to a File 視窗。
  6. 選擇資料型別,例如 Based64,然後單擊 OK。證照的公開部分將建立為 .arm 檔案(請參見圖 2)。

    圖 2. 提取公開部分並將其儲存在檔案中
    提取公開部分並將其儲存在檔案中

  7. 將該 .arm 檔案分發到正在執行 WebSphere Message Broker 的伺服器。
  8. 將該 .arm 檔案匯入伺服器的信任儲存庫:
    1. 將 mikescert.arm 檔案儲存在 server/recipient 計算機上。
    2. 在 server/recipient 計算機上,執行 iKeyman 以啟動 IBM Key Management 工具。
    3. 從下拉選單中選擇 Signer Certificates,如圖 3 所示。

      圖 3. 選擇 Signer Certificate 檢視
      選擇 Signer Certificate 檢視

    4. 單擊 Add 以從檔案匯入公鑰。
    5. 從儲存 .arm 檔案的位置選擇 mikescert.arm,如圖 4 所示,然後單擊 OK

      圖 4. 選擇要匯入的 ARM 檔案
      選擇要匯入的 ARM 檔案

    6. 為匯入的證照提供名稱,如圖 5 所示,然後單擊 OK

      圖 5. 命名公開證照
      命名公開證照

  9. 要檢查該信任儲存庫,可以執行 keytool 實用工具以顯示內容。從命令列輸入 keytool -list -keystore c:\argo\security\server.keystore –v。清單 1 顯示了此命令的典型輸出。

    清單 1. keytool 命令的典型輸出
                            
    Alias name: mikespublickey
    Creation date: 06-Mar-2008
    Entry type: trustedCertEntry
    		      
    Owner: CN=KDHMT99.hursley.ibm.com, C=GB
    Issuer: CN=KDHMT99.hursley.ibm.com, C=GB
    Serial number: 47cfeaf6
    Valid from: 06/03/08 13:00 until: 06/03/09 13:00
    Certificate fingerprints:
    MD5:  36:52:BF:C0:E4:67:6F:E2:3F:1E:00:91:5D:0B:8A:54
    SHA1: F4:50:21:6B:16:60:A3:3B:ED:56:59:AE:03:1A:E6:5D:52:DC:57:66
    

  10. 現在您已經填充了信任儲存庫和金鑰儲存庫,下面可以執行 mqsichangeproperties 命令(並將物件名稱設定為 ComIbmJVMManager)來為 WebSphere Message Broker 定義金鑰儲存庫。
  11. 為 WebSphere Message Broker(針對所有執行組)設定金鑰儲存庫屬性,或在 WebSphere Message Broker(此示例使用了 2008年 5 月釋出的 WebSphere Message Broker V6.1 GA2 版本)中為某個單獨的執行組設定金鑰儲存庫屬性。清單 2 為名為 test_brk 的 WebSphere Message Broker 和名為 testexecutiongroupname 的執行組設定金鑰儲存庫。從 WebSphere Message Broker 控制檯中使用下面的命令。

    清單 2. 為執行組定義金鑰儲存庫
                            
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n keystoreFile -v [Location of server keystore]
    		      
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n keystoreType -v JKS
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n keystorePass -v testexecutiongroupname
      Keystore::password
    

    有關 mqsichangeproperties 命令的更多資訊,請訪問 WebSphere Message Broker 資訊中心(請參閱參考資料)。

  12. 下面為 WebSphere Message Broker 的執行組定義信任儲存庫。對於此定義,請指定 truststoreFiletruststoreTypetruststorePass 並附帶 –n 引數,如清單 3 所示。

    清單 3. 定義執行組的信任儲存庫
                            
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n truststoreFile -v [Location of server truststore]
    		      
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n truststoreType -v JKS
    mqsichangeproperties test_brk -e testexecutiongroupname -o 
      ComIbmJVMManager -n truststorePass -v testexecutiongroupname
      Truststore::password
    

報告執行組設定

在為 WebSphere Message Broker 定義金鑰儲存庫以後,您可以使用 mqsireportproperties 命令來檢視名為 test_brk 的 WebSphere Message Broker 和名為 testexecutiongroupname 的執行組的設定(請參見清單 4)。)


清單 4. 使用 mqsireportproperties

                
mqsireportproperties test_brk -e testexecutiongroupname -o ComIbmJVMManager –r

代理範圍的設定

如果還沒有為執行組設定屬性的話,使用 mqsichangeproperties 命令來設定的屬性將應用於整個 WebSphere Message Broker。mqsireportproperties test_brk -o BrokerRegistry –a 為您提供了用於代理範圍的設定的命令,如清單 5 所示。


清單 5. 報告代理範圍的設定

                
BrokerRegistry=''     
uuid='BrokerRegistry'
brokerKeystoreType='JKS'
brokerKeystoreFile=''
brokerKeystorePass='brokerKeystore::password'
brokerTruststoreType='JKS'
brokerTruststoreFile=''
brokerTruststorePass='brokerTruststore::password'
httpConnectorPortRange=''
httpsConnectorPortRange=''
使用代理範圍的信任儲存庫密碼來更新 WebSphere Message Broker

下面您將通過為其提供信任儲存庫密碼來更新 WebSphere Message Broker;請注意,必須停止 WebSphere Message Broker 才能完成此操作。清單 6 顯示了該命令的情況。


清單 6. 更改代理範圍的信任儲存庫金鑰

                
mqsisetdbparms test_brk 
-n brokerTruststore::password 
-u temp -p pa55word

此時,您已經設定並定義了金鑰儲存庫,並且您已經準備好了解有關簽名的更多資訊了。

簽名

您希望驗證傳送到接收者的訊息還沒有被篡改。任何人都可以閱讀該訊息中的資料,但是您可以檢查內容的完整性。

為此,可以應用 WS-Security 標準來指示訊息的哪些位已進行了雜湊操作。使用此資訊來定義應用於訊息的策略,以支援對訊息進行簽名。訊息是包含標頭資訊的信封,可以使用標頭資訊來告訴接收系統如何對傳入訊息進行身份驗證。

圖 6 顯示了不同的部分如何聯絡在一起。


圖 6. 顯示客戶端與伺服器之間關係的體系結構概述
顯示客戶端與伺服器之間關係的體系結構概述

您可以看到金鑰的私有和公開部分儲存在何處以及儲存在哪一個金鑰儲存庫中。您還可以看到使用者和提供者之間的關係。下面對這些角色進行細分:

  • 提供者是服務的提供者;在此例中是一個 SOAP 服務。
  • 使用者是服務的使用者;在此例中是使用該 SOAP 服務的客戶端。

客戶端是發起者和使用者。WebSphere Message Broker 是提供者和接收者。在為 WebSphere Message Broker 建立繫結配置(本文稍後將介紹此過程)時,將引用標籤為 A 和 B 的流。

簽名:WS-Security 信封

圖 7 顯示了該信封的不同部分如何聯絡在一起,意味著 KeyInfo 欄位指向訊息中的證照。

在此例中,簽名資訊指向訊息的正文。


圖 7. 訊息信封引用
訊息信封引用

圖 8 顯示了訊息正文部分及其對應的 DigestValue。然後對所有的 SignedInfo 進行了簽名以提供 SignatureValue


圖 8. WS-Security 規範中的安全標頭示例
WS-Security 規範中的安全標頭示例

引用驗證

SignedInfo 中的引用標識了將要進行摘要、雜湊或同時進行摘要和雜湊操作的內容;在此例中為 myBody。接收者也使用引用中標識的方法來生成值。接收者計算 DigestValue,然後將結果與所提供的 DigestValue 做比較以完成驗證。

簽名驗證

有兩個引數用作簽名演算法的輸入:

  • KeyInfo
  • CanonicalizationMethod 的八位位元組流輸出。

規範化(Canonicalization) 是規範化 XML 資料的方法。這意味著規範化的 XML 資料始終提供相同的 DigestValue

接收者使用 SignatureMethodKeyInfo 的規範形式來確認 SignatureValue。如果經過摘要操作的值與生成的值匹配,並且簽名值與生成的值匹配,則訊息是安全的。在 WebSphere Message Broker 中,此行為是通過策略來定義並通過繫結來應用的。

在能夠進行驗證之前,還必須驗證 KeyInfo 以確保證照是有效的。當訊息從發起者流出時,證照就開始流動。證照包含在訊息的 BinarySecurityToken 部分中。該部分是 base64 編碼。該證照的部分內容也經過了簽名,以便 WebSphere Message Broker 能夠驗證該證照是對 WebSphere Message Broker 可用的信任儲存庫中包含的正式證照頒發機構或自簽名證照。

WebSphere Message Broker:策略設定

WebSphere Message Broker 支援一種策略型別,該策略型別用於 WS-Security。

  1. 使用 WebSphere Message Broker Toolkit 的 Administration 透檢視來建立並修改策略:
    • Configuration Manager 建立到正在執行的代理的連線。
    • 選擇執行的代理,然後右鍵單擊並啟動 Policy Set Editor
  2. 通過選擇 Policy Set 然後單擊 Add 來建立新的策略,如圖 9 所示。

    圖 9. 建立新策略(此示例中建立了 Policy_2)
    建立新策略(此示例中建立了 Policy_2)

    下面的示例指導您完成配置 WebSphere Message Broker 以進行簽名的過程。在圖 10 的皮膚上忽略 UserName authentication tokens 和 x.509 authentication tokens。這用於使用者 ID 和密碼身份驗證,本文將不介紹這方面。



    圖 10. 身份驗證令牌
    身份驗證令牌

  3. 在左側的窗格中,開啟 Message Level Protection,並選中 Message level protectionRequire signature confirmation 框(請參見圖 11)。

    圖 11. 訊息級別的保護
    訊息級別的保護

  4. 在左側窗格中選擇 Tokens,如圖 12 所示。

    圖 12. 顯示發起者和接收者令牌
    顯示發起者和接收者令牌

  5. 新增兩個條目,一個用於發起者引用,一個用於接收者引用,並使用 Add 按鈕來對這些引用進行命名。然後選擇 Token Type 列,該列提供了下拉選單,您可以從下拉選單中選擇 InitiatorRecipient
  6. 選擇 Exclusive canonicalization 以設定將在做出選擇時使用的演算法,如圖 13 所示。

    圖 13. 選擇規範化演算法
    選擇規範化演算法

  7. 在左側的窗格中,選擇 Message Part Protection(請參見圖 14)。

    圖 14. 訊息部分保護
    訊息部分保護

  8. 建立一個針對 Request 訊息的條目,並建立一個針對 Response 訊息的條目。然後通過將 Message Body 下的值設定為 Yes,從而選擇訊息的整個正文部分。如果希望對訊息的正文簽名,您必須始終以同樣的方式設定這些策略選項。如果只希望對訊息的部分內容簽名,您可以使用 Alias、Qname 和 Xpath 來標識訊息的該部分(本文不包括此選項)。

現在您需要設定策略繫結,以確定如何使用此策略。

策略集繫結

首先,建立一個新的繫結。

  1. 建立 Bindings_2,並將 Policy_2 策略與之關聯,如圖 15 所示。

    圖 15. 將新的繫結與剛才建立的策略集相關聯
    將新的繫結與剛才建立的策略集相關聯

  2. 選擇 Message Part Policy,並在 Signature Protection 下建立兩個條目,如圖 16 所示。

    圖 16. 簽名保護
    簽名保護

上面的條目將始終具有與發起者引用相關聯的請求和與接收者引用相關聯的響應。

設定金鑰資訊

入站流

入站請求(在圖 6 和圖 17 中的標籤為 A)將訊息中的證照傳遞到 WebSphere Message Broker。由於在繫結的 Certificates 列中設定了值 TrustStore,如圖 17 所示,因此將根據 CA 證照來檢查訊息中的證照。儲存在信任儲存庫中的 CA 的公鑰用於驗證所傳遞的證照。如果證照經過成功驗證,則使用與信任儲存庫中的公鑰匹配的公鑰來驗證簽名。

對於入站的情況,不需要任何其他條目。

出站流

對於出站流(在圖 6 和圖 17 中的標籤為 B),提供者發出的響應是對發起者的應答。如果此應答訊息也要進行簽名,則您將使用私鑰來進行此簽名。這是圖 17 中的 internal recipient reference。此私鑰是從伺服器的金鑰儲存庫而不是信任儲存庫獲得的(其設定與信任儲存庫相同,但是針對金鑰儲存庫執行)。您需要確定伺服器金鑰儲存庫中的條目,這是通過指定 DN 和金鑰別名來實現的。圖 17 顯示瞭如何為金鑰資訊配置 DN 和別名的示例,其中每個方向分別標記為 A 和 B。


圖 17. 金鑰資訊
金鑰資訊

現在您已經設定了繫結,下面需要使用 WebSphere Message Broker 工具的 Bar 檔案編輯器,將此繫結與流關聯起來。

現在您已經配置好 WebSphere Message Broker 來進行簽名!

總結

本文闡述了一些有關對訊息進行簽名的 WS-Security 概念。您瞭解了金鑰儲存庫的使用,包括如何使用它們來設定簽名。然後您使用了一個在 WebSphere Message Broker 中建立策略和繫結的工作示例,從而完成了設定 WebSphere Message Broker 以允許流簽名所需要的步驟。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-412084/,如需轉載,請註明出處,否則將追究法律責任。

相關文章