菜鳥學堂:
wse對加密的支持
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了。