首页 > 开发 > 综合 > 正文

利用WSE 加密SOAP报文(6

2024-07-21 02:21:39
字体:
来源:转载
供稿:网友
加密对外发送的报文

我已经修改了前面的getxmldocument方法,让它可以使用由wse实现的基于x.509非对称加密技术。加密回应报文,findcertificatebysubjectstring方法可以用来接收客户端证书的公开备份,一个来自本地机器账号的个人储存室给的客户端证书。这个证书然后被用来创建一个新的 x.509安全token,这个token将被加入到响应报文的soapcontext的安全token集合里。另外,在对称加密例子中引用的命名空间,你应该再加一个using指示附来引用一个microsoft.webservices.security.x509命名空间。getxmldocument方法代码如下:

//创建一个用于返回的简单xml文档

xmldocument mydoc = new xmldocument();

mydoc.innerxml =

"<encryptedresponse>this is sensitive data.</encryptedresponse>";

"<encryptedresponse>这里是敏感数据.</encryptedresponse>";



//得到响应报文的soapcontext

soapcontext mycontext = httpsoapcontext.responsecontext;



//打开并读取本地机器帐号的个人证书储存室

x509certificatestore mystore =

x509certificatestore.localmachinestore(

x509certificatestore.mystore);

mystore.openread();



//查找所有名为”我的证书”的证书,然后将所有匹配的证书添加到证书集合中

x509certificatecollection mycerts =

mystore.findcertificatebysubjectstring("my certificate");

x509certificate mycert = null;



//查找在集合中中的第一个证书

if (mycerts.count > 0)

{

mycert = mycerts[0];

}



//确定我们有一个可以用于加密的证书

if (mycert == null || !mycert.supportsdataencryption)

{

throw new applicationexception("service is not able to

encrypt the response");



return null;

}

else

{

//使用有效的证书来创建一个安全token

x509securitytoken mytoken = new x509securitytoken(mycert);

//wse将使用这个标记来加密报文正文的

//wse产生一个keyinfo元素,用来请求客户端上曾用于给报文解密的证书



encrypteddata myencdata = new encrypteddata(mytoken);

//将已加密数据元素添加到响应报文的soapcontext上

mycontext.security.elements.add(myencdata);



return mydoc;

}

基于前面的方法,wse管道产生了下面的有相应security头、密文和密钥信息的元素:

<?xml version="1.0" encoding="utf-8"?>

<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"

xmlns:xsd="http://www.w3.org/2001/xmlschema">

<soap:header>

<wsu:timestamp

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

<wsu:created>2003-02-11t01:34:01z</wsu:created>

<wsu:expires>2003-02-11t01:39:01z</wsu:expires>

</wsu:timestamp>

<wsse:security soap:mustunderstand="1"

xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">

<xenc:encryptedkey

type="http://www.w3.org/2001/04/xmlenc#encryptedkey"

xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">

<xenc:encryptionmethod

algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />

<keyinfo xmlns="http://www.w3.org/2000/09/xmldsig#">

<wsse:securitytokenreference>

<wsse:keyidentifier valuetype="wsse:x509v3">

ymlkvwxyd8vuguyliuiydeaqqpw=

</wsse:keyidentifier>

</wsse:securitytokenreference>

</keyinfo>

<xenc:cipherdata>

<xenc:ciphervalue>uj64addf3fd59xsaq=&atilde;&#8218;&acirc;…</xenc:ciphervalue>

</xenc:cipherdata>

<xenc:referencelist>

<xenc:datareference uri=

"#encryptedcontent-608eef8b-4104-4469-95b6-7cb4703cfa03" />

</xenc:referencelist>

</xenc:encryptedkey>

</wsse:security>

</soap:header>

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

wsu:id="id-70179c5b-4975-4932-9ecd-a58feb34b0d3">

<xenc:encrypteddata

id="encryptedcontent-608eef8b-4104-4469-95b6-7cb4703cfa03"

type="http://www.w3.org/2001/04/xmlenc#content"

xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">

<xenc:encryptionmethod

algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />

<xenc:cipherdata>

<xenc:ciphervalue>

4o1b4befwbju6tzuaygfraax0ugtaykcw2klibuzpjli...z8i2yphn4+w==

</xenc:ciphervalue>

</xenc:cipherdata>

</xenc:encrypteddata>

</soap:body>

</soap:envelope>

注意在这个已加密的报文里面,由非对称加密过的encryptedkey元素包含了用于给报文正文加密的对称加密密钥。referencelist元素引用了报文正文的encrypteddata元素的id属性。虽然我在我的例子中没这样做,标记这个消息以便能让容器验证发送者其实是个不错的想法。关于使用wse来标记报文的详细信息,看ws-security authentication and digital signatures with web services enhancements
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表