引言
Web 服務是一些虛擬軟件組件,可以通過各種協議和格式對它進行訪問和調用。這些組件所處的環境各不相同且是分布式的。因此,需要一個安全通信基礎架構來確保這些組件之間的消息(和內容)的安全性。
Web 服務安全性(Web Services Security ,WS-Security 或 WSS) 十分靈活,可以將它設計成一個基礎平臺,可以在此平臺上構建各種安全模型,包括公鑰基礎架構(PKI)、Kerberos 和安全套接字層(SSL)。特別是,WS-Security 支持多種安全性令牌、多種信任域、多種簽名格式以及多種加密技術。
這個規范提供了三種主要機制:
安全性令牌傳播
消息完整性
消息機密性。
這些機制本身并不提供完整的安全性解決方案。相反,WS-Security 是一個構件,它可以與其他的 Web 服務擴展及更高層的特定于應用程序的協議一起使用,從而提供各種各樣的安全性模型和加密技術。這些機制可以獨立使用(例如,用于傳遞安全性令牌),也可以非常緊密地集成在一起(例如,簽名和加密消息,以及提供與用于簽名和加密的密鑰相關聯的安全性令牌層次)。
本文假定您具有一定的 Web 服務、J2EE 技術及 WebSphere® Application Server V5.0.2 的基本知識。通過閱讀本文,您將會理解如何在現有的基礎架構上使用 WS-Security,同時也將了解一種聲明性的編程模型,即 WebSphere Application Server V5.0.2 提供保護應用程序的通信基礎架構。
WebSphere Application Server V5.0.2 中的 WS-Security
WebSphere Application Server V5.0.2 通過一種聲明性模型來使用 WS-Security。這種模型的創建和修改可以通過 WebSphere Studio Application Developer Version 5.1、WebSphere Application Server V5.0.2 中可用的應用服務器工具包(ASTK)或 WebSphere 管理控制臺來完成。為了更深地理解這一技術,我們將在此描述一下手動過程。
可以傳播的安全性令牌是 Username 令牌、基于 X.509 的證書以及輕量級第三方驗證(LTPA);同時還有一個 API 來為用戶定義的令牌提供插件。消息完整性是由基于 PKI 的數字簽名提供的(目前還不支持對稱密鑰簽名),而消息機密性是由 XML 加密法提供的。
WebSphere 安全性處理程序通過讀取已聲明的部署擴展來獲取配置和實施 WS-Security 基礎架構,如圖 1 所示。它們被實現為基于 WebSphere 運行時的 JAX-RPC 處理程序,并且對于應用程序開發人員是透明的。
樣本帳戶服務
WebSphere Application Server V5.0.2 有一種方便而強大的方式來啟用 WS-Security,從而為應用程序的通信鏈路提供 MLS。它可以讓您獲取現有的任何服務的 Web 服務描述語言(WSDL),并為您提供必要的 WS-Security 擴展和綁定來保護 Web 服務客戶端和服務器之間的消息。
本文假定已經有了一個要應用 WS-Security 必須啟用的 Web 服務。這里使用的示例服務是 Aclearcase/" target="_blank" >ccountService,它是由一個假設的銀行(SomeBank)提供的。
AccountService 是一個簡單的 Web 服務;出于演示的目的,它并沒有執行真正的業務處理。它包含一個簡單的操作 accountEnquiry,這一操作獲取 AccountRequest 消息并返回 AccountResponse 消息。AccountRequest 消息包含有 AccountID 和 AccountType 信息。AccountResponse 包含有帳戶信息傳遞之后的結算。accountEnquiry 操作并沒有執行任何基于請求消息的處理,而是返回一個固定的結算值 12345.0。然而,這些消息是很重要的,因為我們將要使用 tcpmon(一個真正監聽消息的實體)來監控它們在線路中傳送的情況——首先看采用不安全的消息格式的情況,然后再看具有各種 WS-Security 配置的情況。
為了演示的方便,我們在服務中將 accountEnquiry 操作作為四個獨立的端口公開;配置 WS-Security 之后就會使用這些端口。然而,對于不安全的服務來說,所有的端口都是相類似的。在為 AccountService 配置 WS-Security 時會討論這些端口。
我們先來安裝 AccountService 和它的客戶端。
安裝和運行不安全的服務
要安全和測試不安全的 AccountService,您需要執行以下的操作:
下載 WSS-Sample.zip 文件并將其解壓到一個臨時文件夾中。
使用 WebSphere 管理控制臺來安裝企業應用程序 AccountService(即 SomeBankService.ear 文件)??稍?code/service 目錄下安裝。請確保選擇的是缺省的選項,并在安裝后保存配置。
使用控制臺來啟動企業應用程序。
打開一個瀏覽器,訪問 http://localhost:9080/SomeBankService/services/SomeBankPort 來測試服務是否可用 。如果您得到消息“And now ... Some Services”,就表明您已經成功地配置了 SomeBank AccountService。
您還可以訪問 http://localhost:9080/SomeBankService/services/SomeBankPort?WSDL 來檢查 AccountService WSDL 是否可用。該 WSDL 必須和附錄所示的 WSDL 相類似。
安裝和運行不安全的客戶端
要安裝 AccountService 的客戶端,您需要執行以下的操作:
使用 WebSphere 管理控制臺來安裝 Web 應用程序(即 SomeBankClient.war 文件)??稍?code/client 目錄下安裝。在安裝 WAR 文件時,請確保在 Web 模塊中鍵入 Context Root。請選擇缺省值,并在安裝后保存配置。
使用控制臺啟動 Web 應用程序。
打開一個瀏覽器,訪問 http://localhost:9080/<context-root> 來測試一下客戶端是否正確安裝。
您將會看到圖 2 所示的屏幕。
客戶端的缺省選擇是可用的,可以用它們來測試剛剛安裝的 AccountService。單擊 Submit,您將會看到如圖 3 所示的結果頁面。
現在我們已經成功地安裝了服務和客戶端,現在讓我們回顧一下客戶端的輸入選項:
Account ID and Account Type: 這些是虛構的輸入,因為服務響應是固定的。但是它們也是重要的,因為在您使用 tcpmon 來監控消息時您將會看到它們。
Message Encryption: 在配置 WS-Security 之后打開線路中的消息的 XML 加密,從而提供消息的機密性。
Message Signing:在配置 WS-Security 之后打開線路中的消息的 XML 數字簽名,從而提供消息的完整性。
Service Port:指向基于 HTTP 的端口,在這一端口中服務是可用的。您可以使用這一選項來指向一個 tcpmon 代理端口(將在下面討論),以便觀察 Web 服務請求和響應消息。
Transport Protocol:用于選擇是否使用 SSL。如果選中 HTTPS,則客戶端就會被局限于使用 WebSphere 內部 SSL 端口 9443。顯然,如果這樣選擇的話,tcpmon 就不能夠在線路中觀察消息了。
因此,同時使用 MLS 和 TLS 來配置安全性選項時會有八種組合,由以下選項構成:
XML 加密 [啟用/禁用]
數字簽名 [啟用/禁用]
SSL [啟用/禁用]。
這使得客戶端具有足夠多的選擇來觀察 WS-Security 機制。
使用 tcpmon 來觀察消息
tcpmon 是 WebSphere Application Server V5.0.2 附帶的一個實體。通過代理端口,tcpmon 可以用于查看和檢查 SOAP 消息(請求和響應)。
要配置 tcpmon 以便在不安全的場景中監控消息,您需要執行以下的操作:
檢查 <WAS_HOME>/bin 目錄中是否有一個 tcpmon.bat 文件。如果有,則直接執行步驟 3。
將清單 1 復制和粘貼到一個文件中,從而創建 tcpmon.bat 文件。
清單 1. tcpmon.bat 的源代碼
@REM Copyright IBM Corp. 2002 ,2003
@setlocal
@echo off
SET CONSOLE_ENCODING=-Dws.output.encoding=console
call "%~dp0setupCmdLine.bat"
"%JAVA_HOME%\bin\java" %CONSOLE_ENCODING% "-
Dws.ext.dirs=%WAS_EXT_DIRS%;%WAS_USER_DIRS%" -classpath
"%WAS_HOME%"\lib\webservices.jar;"%WAS_CLASSPATH%";"%CLASSPATH%"
com.ibm.ws.bootstrap.WSLauncher com.ibm.ws.webservices.engine.utils.tcpmon
@endlocal
運行 tcpmon.bat 程序,您將會看到圖 4 所示的屏幕。
在 Listen Port # 字段中鍵入可用的端口(例如,9999)。
在 Target Hostname 字段中鍵入 localhost。
在 Target Port # 字段中鍵入 9080。
單擊 Add,這樣就會顯示一個面板,該面板監聽端口 9999 并將請求轉發給 localhost:9080。
現在,請切換到顯示 AccountService 客戶端的瀏覽器,在 Service Port 字段中鍵入端口 9999。單擊 Submit。
Account Service 客戶端具有如上所述的行為。在 tcpmon 面板中,請注意請求(上面板)和響應(下面板)消息,如圖 5 所示。
請仔細觀察這些消息,特別是 SOAP 頭部和主體。找出請求的 SOAP 主體,
原文轉自:http://www.anti-gravitydesign.com