WSE對加密的支持<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
WSE支持對SOAP 報文的部分加密.對稱加密使用一個共享的密鑰,不對稱加密支持使用x.509證書.當使用WSE來加密SOAP報文時,整個body節點的內容被加密,除非明確指定不要加密.下面舉了2個例子,一個加密這個主體部分,一個加密部分.
WSE運行時庫實現了所有的WS-security.在SecurityInputFilter 和SecurityOutputFilter 類中SecurityOutputFilter 類中.前者通過查找Security節點在一個
進入的SOAP報文中,如果該節點存在.它創建了一個代表任意安全標記和加密密鑰,解密節點,驗證任何數字簽名的對象.對於一個進入的報文,任何任何安全的節點都剋通過報文產生的SOAPcontext對象的安全屬性進行訪問.相反的, SecurityOutputFilter爲進出報文實施加密和簽名的操作,附帶任何特定的安全標記或者加密密鑰.安全措施,比如添加標記,加密,或者簽署進出報文利用報文的SOAPContext.Security和SOAPContext.ExtendedSecurity屬性, ExtendedSecurity只在需要創建安全報頭時候使用Security屬性只在爲包含最終目的地時使用
配置WSE
儘管在安裝時,WSE已經被安裝到asp.net Web 服務器上,但是還需要一些額外的配置,如果需要那些asp.net應用使用安全支持的話.當創建完畢asp.net Web 服務後工程後,visual studio.net,引用Microsoft.Web.Services.dll 程序集需要加載到該項目中.你也需要對SOAPExtensionTypes節點添加一個新的SOAP擴展.這可在 Web.config文件中創建一個新的 add 節點.如下所示
<configuration>
<system.Web>
...
<WebServices>
<SOAPExtensionTypes>
<add type=
"Microsoft.Web.Services.WebServicesExtension,
Microsoft.Web.Services,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=31bf3856ad364e35"
priority="1" group="0" />
</SOAPExtensionTypes>
</WebServices>
</system.Web>
</configuration>
type屬性的值必須不能包含任何間斷或者額外的空格.這個例子爲了可讀性有額外的換行. 如果WebServices 和SOAPExtensionTypes 節點不存在,它們必須加到 Web.config文件裏面.一種更容易的方法是完全WSE配置工具.一種visual studio的插件,使用它您可以非常容易的配置使用WSE的Web service 項目.當然還有一下其他相關的配置必須手工配置.
當使用WSE進行編程時,你需要添加一個Microsoft.Web.Services 和一個System.security名字空間的引用.在客戶端和服務器端的工程中,如果既在客戶請求和服務器迴應中加密了.在客戶部分你應該使用添加Web引用工具爲基於WSE的Web service工程產生Web service代理.
給SOAP報文進行對稱加密
接下來,讓我們再來看看如何用WSE來給SOAP報文使用對稱密鑰加密。下面的例子是基於一個啓用WSE的Web服務的,這個Web服務將返回一個SOAP迴應報文,在該報文正文內包含了一些敏感數據。這麼說,客戶端給服務發送一個簡單的Web服務請求,該請求將返回一個由三元 DES對稱加密算法(使用了一個共享密鑰和一個初始向量,IV)加密過的XML文檔,當客戶端收到了加密後的迴應信息後,SecurityInputFilter將調用一個在客戶端的解密密鑰提供程序,來訪問客戶端上相同的共享密鑰,以此來對報文體進行解密,這個解密密鑰提供程序必須由你來編寫,並且提供一個用於同步共享密鑰的方法。這些例子假設雙方都知道密鑰,並且我們所要做的,僅僅是提供密鑰的名字,以此作爲一個暗示,給對方知道我們用的是哪個密鑰加密的信息。
雙方之間管理、同步和和對密鑰保密的時候一定要多加小心。有個解決方案使用了一個分佈式密鑰機制,例如Kerberos。但從WSE的1.0版本開始,WSE就不再繼續支持Kerberos了。