SSL传输的消息中的安全令牌

时间:2009-10-27 08:44:52

标签: wcf soap certificate signature ws-security

我需要在WCF中确保像这样的soap标头:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header>
 <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
  <wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-1D82AB9733B359236712457035776561"></wsse:BinarySecurityToken>
   <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-2">
    <ds:SignedInfo>
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
     <ds:Reference URI="#Timestamp-1">
      <ds:Transforms>
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </ds:Transforms>       <ds:DigestMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <ds:DigestValue>
      </ds:DigestValue>
     </ds:Reference>
     <ds:Reference URI="#id-3">
      <ds:Transforms>
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </ds:Transforms>
      <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <ds:DigestValue>
      </ds:DigestValue>
     </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>
    </ds:SignatureValue>
    <ds:KeyInfo Id="KeyId-1D82AB9733B359236712457035776562">
<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-1D82AB9733B359236712457035776563">
     <wsse:Reference URI="#CertId-1D82AB9733B359236712457035776561" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
     </wsse:SecurityTokenReference>
    </ds:KeyInfo>
   </ds:Signature>
   <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-1">
    <wsu:Created>2009-06-22T20:46:17Z
    </wsu:Created>
    <wsu:Expires>2009-06-22T20:51:17Z
    </wsu:Expires>
   </wsu:Timestamp>
  </wsse:Security>
 </SOAP-ENV:Header>

其中时间戳和正文部分/元素将通过消息(BinarySecurityToken)中包含的直接引用的证书进行数字签名,并且仅在传输级别通过SSL(IIS托管服务)确保机密性。目前Iam使用类TransportSecurityBindingElement和HttpsTransportBinding,但我不能像我想要的那样获得soap头...问题是(根据消息跟踪),在BinarySecurityToken元素中缺少像id,EncodingType,ValueType和message body这样的属性签名(我将ProtectionLevel设置为登录合同)

所以,如果有人掌握这方面的技能,我将非常感激。

1 个答案:

答案 0 :(得分:1)

这是一个黑暗的镜头,因为我不知道任何WCF,但我确实知道SOAP消息签名。

必需品是SOAP body元素中的属性“Id”或“wsu:Id”。签名将使用该Id作为要签名的数据的引用。在您发布的示例中,这是在wsu:Timestamp元素上完成的 - 它的id为

wsu:Id="Timestamp-1"

然后签名使用它作为参考:

 <ds:Reference URI="#Timestamp-1">

在示例中签名也引用:

 <ds:Reference URI="#id-3">

我认为,这是示例正文的id。

我不确定你的工具包的API如何附加ID,但你肯定会在你签名的任何内容上使用它。

EncodingType和ValueType有点棘手。我担心我不知道那个问题。我的诱惑是尝试让Ids正确,然后看看它是否全部落到了位置。它可能会。