利用WSE 加密SOAP报文(6)

原创 2004年03月22日 15:51:00

加密对外发送的报文<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我已经修改了前面的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=…</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

利用WSE 加密SOAP报文(5)

解密收到的报文不管是在客户端还是在服务器端,WSE总是在SecurityInputFilter实现报文解密的,由于对称加密需要由公共密钥派生出来的加密密钥,你需要创建一个SecurityInputFi...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:50
  • 844

利用WSE 加密SOAP报文(2)

一个加密后的SOAP 报文下面的SOAP报文示例有一个payment节点,含有一些敏感的客户信息.OAP:Envelope SOAP:xmlsn="http://www.w3.org/2002/12/...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:50
  • 1229

利用WSE 加密SOAP报文(3)

WSE对加密的支持 WSE支持对SOAP 报文的部分加密.对称加密使用一个共享的密钥,不对称加密支持使用x.509证书.当使用WSE来加密SOAP报文时,整个body节点的内容被加密,除非明确指定不要...
  • loyalzu
  • loyalzu
  • 2004年03月23日 09:55
  • 945

利用WSE 加密SOAP报文(7)

给收到的报文解密当收到一个由X.509证书加密后的报文后,SoapInputFilter会自动尝试使用用户密钥储存室的私有密钥来进行解密,当然,这个需要告诉WSE运行时哪里可以找到这个证书的额外配置信...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:51
  • 785

利用WSE 加密SOAP报文(8)

下面是被WSE在运行时序列化后产生的报文加密后的结果  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http:...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:51
  • 875

利用WSE 加密SOAP报文(4)

加密对外发送的报文这里我简单描述下如何创建一个可以返回个被加密的XML文档的Web服务。第一步先用using指示符来添加必要的命名空间,如下:using System.Web.Services;usi...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:50
  • 781

利用WSE 加密SOAP报文(1)

摘要:如何使用支持WS安全规范的WSE(Microsoft Web Services Enhancements)使加密SOAP能够跨越标准HTTP呢?讲述了SOAP报文加密是如何进行,在WS安全和XM...
  • loyalzu
  • loyalzu
  • 2004年03月22日 15:50
  • 1738

利用WSE 加密SOAP报文增加WEB SERVICE 的安全性

翻译:张勇,周竞 摘要:如何使用支持WS安全规范的WSE(Microsoft Web Services Enhancements)使加密SOAP能够跨越标准HTTP呢?讲述了SOAP报文加密是如何进行...
  • Eastunfail
  • Eastunfail
  • 2004年10月17日 12:40
  • 1708

使用WSE实现对SOAP报文进行加密

摘要:如何使用支持WS安全规范的WSE(Microsoft Web Services Enhancements)使加密SOAP能够跨越标准HTTP呢?讲述了SOAP报文加密是如何进行,在WS安全和XM...
  • deepbluekk
  • deepbluekk
  • 2006年06月01日 09:03
  • 1110

soap报文略说

简单说一下soap报文,有两种版本的报文的报头。 SOAP_1_1_PROTOCOL与SOAP_1_2_PROTOCOL 分别对应的是1.1: 1.2: ...
  • shaguatao
  • shaguatao
  • 2016年09月23日 14:36
  • 1167
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用WSE 加密SOAP报文(6)
举报原因:
原因补充:

(最多只允许输入30个字)