給收到的報文解密
當收到乙個由x.509證書加密後的報文後,soapinputfilter會自動嘗試使用使用者金鑰儲存室的私有金鑰來進行解密,當然,這個需要告訴wse
執行時**可以找到這個證書的額外配置資訊。這個資訊由應用程式配置檔案的security
storelocation="currentuser"
verifytrust="true"
allowtestroot="false" />
在我的例子中,我將x509節點的storelocation屬性設為currentuser,假設證書在當前使用者的證書儲存室裡,當我使用了來自ca的受信任證書之後,我也將verifytrust設為true了。這些屬性還能夠用wse
的設定工具來修改。利用這些資訊,wse
能夠得到報文中證書的私有金鑰,還能用這個來給對稱性會話金鑰解密,解密後的內容到頭來還要給報文正文解密。
選擇用於解密的報文元素
wseencryption_topic8>當整個訊息正文由預設設定給加密後,wse
能被用來給soap
報文內的特定元素加密;唯一的問題是,在security頭元素那的元素不能被加密。你還可以加密巢狀的元素,
在這個例子服務中,我修改了getxmldocument方法用的x.509版本,用乙個基於x.509的安全token來同時給encryptedsubresponse和它的encryptedresponse父節點進行數位化加密,返回的xml文件如下:
回應報文的這裡沒有必要被加密
這裡是敏感資料.
為了加密乙個元素,它需要乙個wsu:id屬性,以便當xml被序列化後引用可以加到該節點上了。命名空間wsu被定義為:
為了完成這個,我將這個xml加到乙個新的xml文件,然後通過.net框架支援的microsoft xml文件物件模型(dom)給它新增乙個id屬性,此外還需要將配件system.xml加入到工程引用裡面,加上下面的話:
using system.xml;
using system.xml.serialization;
當我將多個id屬性加到巢狀的元素上後,我由encryptedsubresponse元素開始依次遍歷到它的父節點encryptedresponse,如下:
string myid = ;
//建立乙個用於返回xml的xml文件
xmldocument mydoc = new xmldocument();
mydoc.loadxml("" +
"回應報文的這裡沒有必要加密" +
"" +
"" +
"" +
"這裡是敏感資料. " +
"" +
"" +
"");
//得到encryptedsubresponse節點
xmlnode= mydoc.firstchild.lastchild.firstchild;
//向上遍歷元素,新增兩個id屬性
//向上保證內部的多數元素可以優先被加密
//否則我們會得到乙個異常
for (int i=0;i
假設我早就用我前面的邏輯得到了來自x.509證書的安全記號,我將這些引用新增到encrypteddata元素,如下:
//迴圈遍歷id值,將其新增到新的encrypteddata元素上
for (int i=0;i
//返回加密資料
return mydoc;
利用WSE 加密SOAP報文 5
解密收到的報文 不管是在客戶端還是在伺服器端,wse 總是在securityinputfilter實現報文解密的,由於對稱加密需要由公共金鑰派生出來的加密金鑰,你需要建立乙個securityinputfilter能夠呼叫的方法來得到這個對稱金鑰,然後你就能使用包含在encrypteddata中的金鑰...
soap報文略說
簡單說一下soap報文,有兩種版本的報文的報頭。soap 1 1 protocol與soap 1 2 protocol 分別對應的是 1.1 xmlns soap env 1.2 xmlns env env envelope 以下附帶乙個報文拼裝基類。當時寫的比較粗略沒有寫上解析響應報文的通用方法,...
oracle 解析soap報文XML報錯
ora 31011 xml parsing failed ora 19202 error occurred in xml processing 1 專案做和ebs的介面,ebs提供乙個webservice服務。在資料庫中訪問ebs的webservice 報文解析沒有問題 突然一天請求回來的xml檔案...