本文是討論如何在企業環境中實現和應用基於Web服務安全技術的安全保護方案系列文章的第
部分
在本系列的第
部分中回顧了現有的解決方案及其缺陷
並提出開發一個新的Web服務安全工具包的方案
此工具包可以解決其中部分缺陷(見第一部分)
本文將進一步介紹此Web服務安全工具包的框架(下載部分源代碼)
並解釋工具包內Web服務安全的特性與Java語言的面向對象特性之間的高層抽象映射關系
客戶端 第一部分中工具包需求部分指出
開發工具包的目的之一是簡化客戶在當前的開發環境下處理Web服務安全的工作
這些工作應該移至框架層
以便框架層最終將這些工作代理到底層基礎設施——真正應該處理這些工作的地方
因此
在討論工具包的結構以及工具包內實體與WSSE相關標准之間的關系前
讓我們將工具包視為一個黑盒子
從客戶的角度來體驗一下(如何使用工具包)
WsseHeaderToken wsseHeader = new WsseHeaderToken();
// Add Timestamp element to the WSSE Header 添加時間戳元素
TsToken ts = wsseHeader
AddTimestamp(
);
// Sign the timestamp element with default certificate使用缺省證書對時間戳元素簽名
WsToken[] sigTokens = new WsToken[] {ts};
wsseHeader
AddSignature(sigTokens);
// Encrypt the signature and body elements with default key 使用缺省的密鑰加密簽名及主體中元素
WsTokenRef[] encTokens = new WsTokenRef[]
{ new DSigTokenRef()
new SoapBodyRef() };
wsseHeader
AddEncryption(encTokens);
wsseHeader
ProcessHeader();
Element soap = wsseHeader
GetSoapEnvelope();
這個簡單示例構造了一個包含時間戳子元素的Web服務安全(以下簡記為WSSE)頭部元素
並從配置文件中獲取XML簽名提供者的信息
使用相應XML簽名提供者工具對時間戳元素簽名
進而使用配置的XML加密提供者對安全頭部中的簽名元素和時間戳元素進行加密
XML文件解析具有過程化的本質
這將帶來處理WSSE XML信息的困難
導致混亂復雜相互糾纏的代碼
工具包中實現了復雜安全規范的代碼
試圖將安全領域的過程化規則映射到面向對象領域的對應部分
包中代表WSSE元素的類
隔離了XML解析過程
創建了處理XML代碼的面向對象的包裝器
工具包提供的WsseHeaderToken類
對一些功能進行了便於使用的封裝
這樣可以使得客戶與框架的復雜性隔離
如果有必要
客戶也可以在代碼內直接創建和訪問工具包內的其他類
例如
當現有幫助類未提供處理某種類型的元素的功能時
可以創建相應的處理器對象進行處理
並將處理結果添加到頭部安全信息中
在下面代碼中使用一個示例處理器和示例標記
演示了如何從WSSE信息頭部拷貝標記元素到另一個WSSE信息頭部
// Reference and read WSSE header with null actor
使用null操作器引用和讀取WSSE 頭部
WsseHeaderRef ref = WsseHeaderRef
CreateFromFile(filename
null);
WsseHeaderToken wsseHeader = ref
GetWsseHeader();
// Reference a sample element in the retrieved header
引用已讀取頭部包含的一個示例元素
SampleTokenRef sampleRef = new SampleTokenRef(wsseHeader
sample
);
SampleToken sample = sampleRef
GetSampleToken();
// Create a new WSSE header and add the element
生成新的安全頭部信息並添加元素
WsseHeaderToken wsseNew = new WsseHeaderToken();
wsseNew
InsertToken(sample);
// Add sample element
s processing in the new WSSE header
在生成的頭部中處理示例元素
SampleProcessor sampleProcessor = new SampleProcessor();
sampleProcessor
SetReplaceTokens(true);
sampleProcessor
AddToken(sample);
wsseNew
AddProcessor(sampleProcessor);
wsseNew
ProcessHeader();
Element soap = wsseNew
GetSoapEnvelope();
框架 框架的結構層次很大程度上可以對應到WSSE規范描述的XML定義塊上
工具包包含如下類型的對象
·表示WSSE 頭部的XML元素
也可以由子元素合成組合元素(compiste)
如果擁有用於生成標記的充足信息
那麼可以從頭開始構建WSSE標記
又或已經從其他WSSE頭部提取出(如SAML斷言等)必要的XML元素
那麼可以通過封裝來創建
WSSE標記在工具包內的基類分別為位於wsse
Toolkit
Tokens包內的WsToken類以及WsCompisteToken類
·標記對象的
指針
通過它們可以對現有的安全標記進行尋址和讀取操作
更一般的作用是作為一種機制
方便客戶指向現有的XML元素並將XML元素轉化為標記對象
標記引用類層次的基類是位於wsse
Toolkit
Refs包內的WsTokenRef類
·標記處理器對象
表示工具包內的操作的對象
可以通過它們對WSSE頭部
頭部內任何子元素以及包含的SOAP信息進行操作
現在的工具包內僅有
個處理器類
DsigProcessor類以及EncProcessor類
通過它們可以在WSSE頭部中添加新的標記和(或者)改變已有標記
實際上
改動/添加標記的特性並不是處理器的必然需求
非改寫的處理器類型也是可能出現的
這樣的意圖在wsse
Toolkit
Processors包內的處理器類型接口ITokenProcessor中得到體現
它的函數簽名設計可以避免引入更多的標記類型
·幫助類對象
wsse
Toolkit
Utils包內的許多幫助類
可以便於客戶進行配置信息處理
XML處理等任務
還有wsse
Toolkit
Saml包用於支持SAML操作
wsse
Toolkit
Directory包用於支持用戶目錄操作
所有這些工具類本身不表示WSSE頭部的任何部分
僅供工具包的其它組件使用
·輔助包裝器對象
此類對象將標記對象和處理器對象封裝起來
組成WSSE安全頭部的構建器
同時強調標記所有權概念
增強標記處理功能
現在工具包內
擴展的標記類WsseHeaderToken
不僅實現了標記對象接口
同時定義了一些便利方法
可以實例化工具包中的類並添加這些對象到本身表示的標記對象中
當然
如果需要
客戶可以自由的直接操作工具包中的對象
需要提到的是
並不是所有對象都是立即可得的
它們會隨著工具包實現階段的不斷展開
在後續的文章中被依次介紹並添加到工具包中來(參見第一部分的結論部分)
如下
圖
顯示了工具包框架中各種對象以及客戶間的關系
圖 工具包的操作 為了更好的理解圖
需要對工具包操作的幾個重點概念進行進一步的解釋
·不是所有的標記元素都可以從現有XML元素生成
例如
重用現有時間戳元素(wsse
Toolkit
Tokens
Wss
TsToken標記)來構建新的標記
沒有什麼實際意義——實際上
需要時應該從頭構建並相應添加新標記
·可從現有XML元素創建的標記類
具有唯一參數類型為org
w
c
dom
Element的構造函數
此構造函數會對輸入的XML數據進行淺層次的數據有效性驗證
所有情況下
必須正確地維護用於構建新標記XML元素的org
w
c
dom
Document對象
不合適的文檔對象會在添加元素時產生錯誤
標記類基類WsToken類
WsConpositeToken類以及幫助類WsTokenHelper具有處理XML文檔的功能
·雖然標記引用類型也都是從基類wsse
Toolkit
Tokens
WsToken派生的
但是大多數引用類型的作用是引用現存的XML元素
不是作為本身可以被添加的元素
不過
在下面的WSSE映射部分會提到一些特殊的標記引用類型
除具有引用元素功能外
本身也可以作為被添加的元素
·標記引用類型可以引用不同的安全信息頭部中的標記元素——此功能有助於在新的WSSE頭部中添加現有標記元素的功能的實現
標記引用類型甚至可以引用在安全處理過程的初期添加的當前不存在的元素
比如前面代碼示例中加密簽名元素構成的元素
·標記幫助類的責任是實例化標記類型對象和標記處理器對象
並將二者聯系起來處理
當然這需要適當的配置信息以及初始化工作
標記處理器類型的責任是操作標記幫助類的處理結果
比如在安全頭部中添加一個新產生的數字簽名元素
處理器接口的要約是僅對引用標記進行適當的處理
並不對此處理過程中產生的新標記進行任何操作
·處理操作可以連接起來構成處理操作鏈
這樣
可以對多個安全頭部的入口簽名
然後對簽名加密
如上面客戶處代碼示例
工具包提供了輕量的對象層次
處理每次客戶調用時
會實例化一些具有僅於自己上下文環境關聯的對象
因此不必擔心並發問題
工具包中大多數類沒有提供同步化鎖
只有wsse
Toolkit
Utils
Xml
XmlFactory 類和 wsse
Toolkit
Utils
Config
ConfigHelper類除外
這兩個類提供了一些可以被多個線程共享的功能
對於配置的目錄服務和SAML服務實現提供者來說
由於工具包的所有運行客戶都訪問相同的提供者
它們的實現必須是線程安全的
WSSE映射 現在
將要討論工具包內的組件是如何與WSSE規范規定的主要構建塊的映射關系
注意
WSSE 規范的第
部分對<wsse:Security>頭部塊是這樣定義的
<wsse:Security>頭部塊以SOAP行動者或角色的形式存在
提供在在SOAP信息中添加針對特定接收者的安全相關信息的機制
這意味著
WSSE安全頭部是可以擴展的
同時在所有可能使用此技術的應用中試圖使用它是不合適的
因此
工具包框架僅對規范中規定的標記類型及其關系進行映射
同時可以在以後添加新的標記類型及其處理器
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27426.html