Маркер безопасности в сообщении, переданном по SSL - PullRequest
2 голосов
/ 27 октября 2009

Мне нужно в WCF обеспечить заголовок мыла вот так:

<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). В настоящее время я использую классы TransportSecurityBindingElement и HttpsTransportBinding, но пока не могу получить мыльный заголовок так, как хочу ... Проблема в том, что в элементе BinarySecurityToken отсутствуют атрибуты, такие как id, EncodingType, ValueType, а тело сообщения не подписано (я установил ProtectionLevel для подписания контракта)

Так что, если у кого-то есть навыки с этим, я буду очень признателен.

1 Ответ

1 голос
/ 28 октября 2009

Это выстрел в темноте, так как я не знаю WCF, но знаю подпись SOAP-сообщения.

Обязательный атрибут - это атрибут "Id" или "wsu: Id" в вашем элементе тела SOAP. Подпись будет использовать этот идентификатор в качестве ссылки для подписываемых данных. В примере, который вы разместили, это делается для элемента wsu: Timestamp - он имеет идентификатор

wsu:Id="Timestamp-1"

И тогда подпись использует это как ссылку:

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

И в примере подпись также ссылается:

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

Который, как я полагаю, является идентификатором тела примера.

Я не уверен, как API вашего инструментария подключается к идентификаторам, но он вам обязательно понадобится для всего, что вы подпишете.

EncodingType и ValueType немного сложнее. Боюсь, я этого не знаю. Мое искушение было бы попытаться получить правильные идентификаторы, а затем посмотреть, все ли встало на свои места. Это может.

...