利用WSE 加密SOAP報文(7)

來源:互聯網
上載者:User
加密 給收到的報文解密

當收到一個由X.509認證加密後的報文後,SoapInputFilter會自動嘗試使用使用者密鑰儲存室的私人密鑰來進行解密,當然,這個需要告訴WSE運行時哪裡可以找到這個認證的額外配置資訊。這個資訊由應用程式設定檔的Security元素所指定,這個例子在用戶端上的應用程式設定檔是App.config。對於 X.509加密,你只需要添加一個x509子節點,內容和下面一樣就可以了

<x509

storeLocation="CurrentUser"

verifyTrust="true"

allowTestRoot="false" />

在我的例子中,我將x509節點的storeLocation屬性設為CurrentUser,假設認證在目前使用者的認證儲存室裡,當我使用了來自CA的受信任認證之後,我也將verifyTrust設為true了。這些屬性還能夠用WSE的設定工具來修改。利用這些資訊,WSE能夠得到報文中認證的私人密鑰,還能用這個來給對稱性工作階段金鑰解密,解密後的內容到頭來還要給報文本文解密。

選擇用於解密的報文元素

當整個訊息本文由預設設定給加密後,WSE能被用來給SOAP報文內的特定元素加密;唯一的問題是,在Security頭元素那的元素不能被加密。你還可以加密嵌套的元素,

在這個例子服務中,我修改了GetXmlDocument方法用的X.509版本,用一個基於X.509的安全Token來同時給EncryptedSubResponse和它的EncryptedResponse父節點進行數字化加密,返回的XML文檔如下:

<Response>

<NotEncrypted>

回應報文的這裡沒有必要被加密

</NotEncrypted>

<EncryptedResponse>

<EncryptedSubResponse>

這裡是敏感性資料.

</EncryptedSubResponse>

</EncryptedResponse>

</Response>

為了加密一個元素,它需要一個wsu:Id屬性,以便當XML被序列化後引用可以加到該節點上了。命名空間wsu被定義為:

xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility

為了完成這個,我將這個XML加到一個新的XML文檔,然後通過.NET架構支援的Microsoft XML文件物件模型(DOM)給它添加一個Id屬性,此外還需要將配件System.Xml加入到工程引用裡面,加上下面的話:

using System.Xml;

using System.Xml.Serialization;

當我將多個Id屬性加到嵌套的元素上後,我由EncryptedSubResponse元素開始依次遍曆到它的父節點EncryptedResponse,如下:



string [] myId = {"Id:" + Guid.NewGuid(),"Id:" + Guid.NewGuid()};





//建立一個用於返回XML的XML文檔

XmlDocument myDoc = new XmlDocument();

myDoc.LoadXml("<Response>" +

"<NotEncrypted>回應報文的這裡沒有必要加密" +

"</NotEncrypted>" +

"<EncryptedResponse>" +

"<EncryptedSubResponse>" +

"這裡是敏感性資料. " +

"</EncryptedSubResponse>" +

"</EncryptedResponse>" +

"</Response>");



//得到EncryptedSubResponse節點

XmlNode = myDoc.FirstChild.LastChild.FirstChild;





//向上遍曆元素,添加兩個Id屬性

//向上保證內部的多數元素可以優先被加密

//否則我們會得到一個異常

for (int i=0;i<myId.Length;i++)

{



//建立新的Id屬性

string wsu = "http://schemas.xmlsoap.org/ws/2002/07/utility";

XmlNode myAttr = myDoc.CreateNode(XmlNodeType.Attribute, "wsu",

"Id", wsu);

myAttr.Value = myId[i];



//將屬性添加到文檔

root.Attributes.SetNamedItem(myAttr);

root = root.ParentNode; // 移動到父節點

}

假設我早就用我前面的邏輯得到了來自X.509認證的安全記號,我將這些引用添加到EncryptedData元素,如下:



//迴圈遍曆Id值,將其添加到新的EncryptedData元素上

for (int i=0;i<myId.Length;i++)

{

//建立一個新的頭,”#”是的首碼,用來保證相關的URI能夠引用到頭

EncryptedData myEncHeader = new EncryptedData(myToken, "#"+myId[i]);

//添加一個新的頭到集合中

myContext.Security.Elements.Add(myEncHeader);

}

//返回加密資料

return myDoc;


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。