熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

企業應用的Web服務安全技術:框架(圖)

2013-11-23 19:46:17  來源: Java高級技術 

  本文是討論如何在企業環境中實現和應用基於Web服務安全技術的安全保護方案系列文章的第部分在本系列的第部分中回顧了現有的解決方案及其缺陷並提出開發一個新的Web服務安全工具包的方案此工具包可以解決其中部分缺陷(見第一部分)本文將進一步介紹此Web服務安全工具包的框架(下載部分源代碼)並解釋工具包內Web服務安全的特性與Java語言的面向對象特性之間的高層抽象映射關系
  
  客戶端
  
  第一部分中工具包需求部分指出 開發工具包的目的之一是簡化客戶在當前的開發環境下處理Web服務安全的工作這些工作應該移至框架層 以便框架層最終將這些工作代理到底層基礎設施——真正應該處理這些工作的地方 因此在討論工具包的結構以及工具包內實體與WSSE相關標准之間的關系前 讓我們將工具包視為一個黑盒子 從客戶的角度來體驗一下(如何使用工具包)
  
  WsseHeaderToken wsseHeader = new WsseHeaderToken();
  // Add Timestamp element to the WSSE Header 添加時間戳元素
  TsToken ts = wsseHeaderAddTimestamp();
  // Sign the timestamp element with default certificate使用缺省證書對時間戳元素簽名
  WsToken[] sigTokens = new WsToken[] {ts};
  wsseHeaderAddSignature(sigTokens);
  // Encrypt the signature and body elements with default key 使用缺省的密鑰加密簽名及主體中元素
  WsTokenRef[] encTokens = new WsTokenRef[]
  { new DSigTokenRef() new SoapBodyRef() };
  wsseHeaderAddEncryption(encTokens);
  wsseHeaderProcessHeader();
  Element soap = wsseHeaderGetSoapEnvelope();
  
  這個簡單示例構造了一個包含時間戳子元素的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 = WsseHeaderRefCreateFromFile(filename null);
  WsseHeaderToken wsseHeader = refGetWsseHeader();
  // Reference a sample element in the retrieved header
  引用已讀取頭部包含的一個示例元素
  SampleTokenRef sampleRef = new SampleTokenRef(wsseHeadersample);
  SampleToken sample = sampleRefGetSampleToken();
  // Create a new WSSE header and add the element
  生成新的安全頭部信息並添加元素
  WsseHeaderToken wsseNew = new WsseHeaderToken();
  wsseNewInsertToken(sample);
  // Add sample elements processing in the new WSSE header
  在生成的頭部中處理示例元素
  SampleProcessor sampleProcessor = new SampleProcessor();
  sampleProcessorSetReplaceTokens(true);
  sampleProcessorAddToken(sample);
  wsseNewAddProcessor(sampleProcessor);
  wsseNewProcessHeader();
  Element soap = wsseNewGetSoapEnvelope();
  
  框架
  
  框架的結構層次很大程度上可以對應到WSSE規范描述的XML定義塊上工具包包含如下類型的對象
  
  ·表示WSSE 頭部的XML元素也可以由子元素合成組合元素(compiste)如果擁有用於生成標記的充足信息那麼可以從頭開始構建WSSE標記 又或已經從其他WSSE頭部提取出(如SAML斷言等)必要的XML元素 那麼可以通過封裝來創建 WSSE標記在工具包內的基類分別為位於wsseToolkitTokens包內的WsToken類以及WsCompisteToken類
  
  ·標記對象的指針通過它們可以對現有的安全標記進行尋址和讀取操作更一般的作用是作為一種機制方便客戶指向現有的XML元素並將XML元素轉化為標記對象標記引用類層次的基類是位於wsseToolkitRefs包內的WsTokenRef類
  
  ·標記處理器對象表示工具包內的操作的對象可以通過它們對WSSE頭部頭部內任何子元素以及包含的SOAP信息進行操作現在的工具包內僅有個處理器類DsigProcessor類以及EncProcessor類 通過它們可以在WSSE頭部中添加新的標記和(或者)改變已有標記實際上改動/添加標記的特性並不是處理器的必然需求非改寫的處理器類型也是可能出現的這樣的意圖在wsseToolkitProcessors包內的處理器類型接口ITokenProcessor中得到體現它的函數簽名設計可以避免引入更多的標記類型
  
  ·幫助類對象wsseToolkitUtils包內的許多幫助類可以便於客戶進行配置信息處理XML處理等任務還有wsseToolkitSaml包用於支持SAML操作wsseToolkitDirectory包用於支持用戶目錄操作所有這些工具類本身不表示WSSE頭部的任何部分僅供工具包的其它組件使用
  
  ·輔助包裝器對象此類對象將標記對象和處理器對象封裝起來組成WSSE安全頭部的構建器同時強調標記所有權概念增強標記處理功能 現在工具包內擴展的標記類WsseHeaderToken 不僅實現了標記對象接口同時定義了一些便利方法可以實例化工具包中的類並添加這些對象到本身表示的標記對象中當然如果需要客戶可以自由的直接操作工具包中的對象
  
  需要提到的是並不是所有對象都是立即可得的它們會隨著工具包實現階段的不斷展開在後續的文章中被依次介紹並添加到工具包中來(參見第一部分的結論部分)
  
  如下顯示了工具包框架中各種對象以及客戶間的關系
  
 
  圖 工具包的操作

  
  為了更好的理解圖需要對工具包操作的幾個重點概念進行進一步的解釋
  
  ·不是所有的標記元素都可以從現有XML元素生成例如重用現有時間戳元素(wsseToolkitTokensWssTsToken標記)來構建新的標記沒有什麼實際意義——實際上需要時應該從頭構建並相應添加新標記
  
  ·可從現有XML元素創建的標記類具有唯一參數類型為orgwcdomElement的構造函數此構造函數會對輸入的XML數據進行淺層次的數據有效性驗證所有情況下必須正確地維護用於構建新標記XML元素的orgwcdomDocument對象不合適的文檔對象會在添加元素時產生錯誤標記類基類WsToken類WsConpositeToken類以及幫助類WsTokenHelper具有處理XML文檔的功能
  
  ·雖然標記引用類型也都是從基類wsseToolkitTokensWsToken派生的但是大多數引用類型的作用是引用現存的XML元素不是作為本身可以被添加的元素不過在下面的WSSE映射部分會提到一些特殊的標記引用類型除具有引用元素功能外本身也可以作為被添加的元素
  
  ·標記引用類型可以引用不同的安全信息頭部中的標記元素——此功能有助於在新的WSSE頭部中添加現有標記元素的功能的實現標記引用類型甚至可以引用在安全處理過程的初期添加的當前不存在的元素 比如前面代碼示例中加密簽名元素構成的元素
  
  ·標記幫助類的責任是實例化標記類型對象和標記處理器對象並將二者聯系起來處理當然這需要適當的配置信息以及初始化工作標記處理器類型的責任是操作標記幫助類的處理結果比如在安全頭部中添加一個新產生的數字簽名元素處理器接口的要約是僅對引用標記進行適當的處理並不對此處理過程中產生的新標記進行任何操作
  
  ·處理操作可以連接起來構成處理操作鏈這樣可以對多個安全頭部的入口簽名然後對簽名加密 如上面客戶處代碼示例
  
  工具包提供了輕量的對象層次處理每次客戶調用時會實例化一些具有僅於自己上下文環境關聯的對象 因此不必擔心並發問題工具包中大多數類沒有提供同步化鎖只有wsseToolkitUtilsXmlXmlFactory 類和 wsseToolkitUtilsConfigConfigHelper類除外這兩個類提供了一些可以被多個線程共享的功能對於配置的目錄服務和SAML服務實現提供者來說由於工具包的所有運行客戶都訪問相同的提供者它們的實現必須是線程安全的
  
  WSSE映射
  
  現在將要討論工具包內的組件是如何與WSSE規范規定的主要構建塊的映射關系注意WSSE 規范的第部分對<wsse:Security>頭部塊是這樣定義的<wsse:Security>頭部塊以SOAP行動者或角色的形式存在提供在在SOAP信息中添加針對特定接收者的安全相關信息的機制 這意味著 WSSE安全頭部是可以擴展的 同時在所有可能使用此技術的應用中試圖使用它是不合適的 因此工具包框架僅對規范中規定的標記類型及其關系進行映射同時可以在以後添加新的標記類型及其處理器
  
  From:http://tw.wingwit.com/Article/program/Java/gj/201311/27426.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.