WCF - Реализация клиента, который требует шифрования одного элемента soap: body, как? - PullRequest
1 голос
/ 24 июня 2011

Я искал это повсеместно, и пока он не выглядит многообещающим, пытаясь написать клиентское приложение, которое использует стороннюю службу (пример запроса ниже, из java-клиента).Единственное, что нужно, это ожидать, что один элемент в теле будет зашифрован.

В идеале это будет решение WCF, хотя я читал несколько мест об использовании WSE1 / 2./ 3, чтобы приблизиться к этому (не очень хотелось, так как WSE стоит на месте), кто-нибудь сталкивался с проблемой такого типа?

<?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" xmlns:tns="http://editedURL">
  <soap:Header>
    <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
            wsu:Id="Timestamp-2d960151-fc35-4522-a8cd-b463025209d8">
        <wsu:Created>2010-11-23T16:17:36Z</wsu:Created>
      </wsu:Timestamp>
      <wsse:BinarySecurityToken ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" 
            EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" 
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
            wsu:Id="SecurityToken-68e70781-8ff5-4e08-b066-8b9c6badef37"><!--token was here --></wsse:BinarySecurityToken>
      <xenc: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:Reference URI="#SecurityToken-68e70781-8ff5-4e08-b066-8b9c6badef37" 
            ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
          </wsse:SecurityTokenReference>
        </KeyInfo>
        <xenc:CipherData>
          <xenc:CipherValue><!--cypher was here --></xenc:CipherValue>
        </xenc:CipherData>
        <xenc:ReferenceList>
          <xenc:DataReference URI="#Enc-5293b4f0-9aa5-4c37-ad1c-7c55c7d9ded1"/>
        </xenc:ReferenceList>
      </xenc:EncryptedKey>
    </wsse:Security>
  </soap:Header>
  <soap:Body>
    <tns:Authenticate>
      <authIn>
        <authID><!-- user id was here plaintext --></authID>
        <authPwd wsu:Id="Id-8bac7fa6-fac9-4ce4-8a5e-3b221c64ca76" 
                xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
          <xenc:EncryptedData Id="Enc-5293b4f0-9aa5-4c37-ad1c-7c55c7d9ded1" Type="http://www.w3.org/2001/04/xmlenc#Content" 
                                mlns:xenc="http://www.w3.org/2001/04/xmlenc#">
            <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
            <xenc:CipherData>
              <xenc:CipherValue><!-- encrypted password was here --></xenc:CipherValue>
            </xenc:CipherData>
          </xenc:EncryptedData>
        </authPwd>
        <authServer><!-- domain was here plaintext --></authServer>
      </authIn>
    </tns:Authenticate>
  </soap:Body>
</soap:Envelope>

Болевая точка - элемент authPwd в мыле: Тело, спасибодля любого понимания

1 Ответ

4 голосов
/ 25 июня 2011

У меня были плохие новости для вас.Внедренная реализация безопасности не может сделать это , и я не уверен, как расширить WCF для поддержки этого, если вы не пишете все материалы WS-Security с нуля.WCF очень расширяемый, за исключением сценариев, в которых вы хотите расширить уже реализованные протоколы - эти классы в основном запечатаны / внутренние и не могут быть использованы повторно.

Вся проблема была бы совершенно иной, если бы эти элементы были SOAP-заголовками, а не элементами тела.

Редактировать:

Я снова проверил все предоставленное вами сообщение SOAP и обнаружил две другие проблемы.

  • Я сомневаюсь в уровне безопасности, который обеспечивает ваша служба.Он не показывает простой текстовый пароль, но это может быть все.Сокрытие пароля - это не только безопасность, которая вам нужна, потому что, если безопасность не реализована правильно, злоумышленник может просто взять все ваше сообщение (зашифрованное как есть) и снова отправить его со своего компьютера.Если служба настроена неправильно, она обработает этот запрос, как и любой другой.Это называется повторной атакой, и основной защитой от этой атаки является отметка времени, но поскольку ваше сообщение не подписано, злоумышленник может изменить значение отметки времени по своему усмотрению.В элементе EncryptedKey может быть дополнительный защитный механизм, но это трудно сказать из самого сообщения.
  • Скорее всего, WCF не сможет обработать сообщение, даже если служба шифрует все тело.Для безопасности «из коробки» необходимы подписи - отметка времени должна быть подписана (по причине, указанной выше), а части сообщения могут быть подписаны или зашифрованы и подписаны, но не только зашифрованы.Подписание зашифрованной части гарантирует, что злоумышленник не заменит опубликованные данные другими.
...