Ошибка wcf: входящее сообщение было подписано токеном, который отличается от того, что используется для шифрования тела. Этого не ожидалось - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь вызвать стороннюю службу с сертификатом verisign test x.509.Когда я получаю ответное сообщение, оно генерирует следующую ошибку:

Входящее сообщение было подписано токеном, который отличается от того, который использовался для шифрования тела.Этого не ожидалось

Этой ошибки я не ожидал, потому что я предоставил службе только один сертификат x.509.Какой еще сертификат он использует?

Любое понимание будет приветствоваться!

Моя пользовательская привязка выглядит следующим образом:

<binding name="NodalCustomBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
      <textMessageEncoding messageVersion="Soap11" />
      <security
        authenticationMode="MutualCertificate"
        requireDerivedKeys="false"
        includeTimestamp="true"
         keyEntropyMode="ClientEntropy"
        messageProtectionOrder="SignBeforeEncrypt"
        messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
        requireSecurityContextCancellation="false"
        allowSerializedSigningTokenOnReply="true"
        enableUnsecuredResponse="true" >
        <secureConversationBootstrap />
      </security>
      <httpsTransport />
    </binding>

Мое поведение конечной точки выглядит так:1015 *

и наконец мое ответное сообщение выглядит так:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 <SOAP-ENV:Header>
   <wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <wsse:BinarySecurityToken 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="SecurityToken-b1a3e7ef-008e-6bc0-b779-69cc8bf72d39Q</wsse:BinarySecurityToken>
  <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
      <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <dsig:Reference URI="#Id-b75df9d2-5a50-d36b-b26a-08ee4065010d">
        <dsig:Transforms>
          <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </dsig:Transforms>
        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <dsig:DigestValue>YKW87r6WtI5b5Mx3D/WIPg2bcIk=</dsig:DigestValue>
      </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>lAB8mXepN63lGSk/lraYooTEFfn8dnwiJ89z8d5S6HKsDjAgg=    </dsig:SignatureValue>
    <dsig:KeyInfo>
      <SecurityTokenReference xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:Reference URI="#SecurityToken-b1a3e7ef-008e-6bc0-b779-69cc8bf72d39" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
      </SecurityTokenReference>
    </dsig:KeyInfo>
  </dsig:Signature>
</wsse:Security>
</SOAP-ENV:Header>
  <SOAP-ENV:Body wsu:Id="Id-b75df9d2-5a50-d36b-b26a-08ee4065010d" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <ns0:ResponseMessage xmlns:ns0="http://www.ercot.com/schema/2007-06/nodal/ews/message">
  <ns0:Header>
    <ns0:Verb>reply</ns0:Verb>
    <ns0:Noun/>
    <ns0:ReplayDetection>
      <ns0:Nonce/>
      <ns0:Created/>
    </ns0:ReplayDetection>
    <ns0:Revision>001</ns0:Revision>
    <ns0:Source/>
    <ns0:UserID>API</ns0:UserID>
  </ns0:Header>
  <ns0:Reply>
    <ns0:ReplyCode>FATAL</ns0:ReplyCode>
    <ns0:Error>Invalid Verb</ns0:Error>
    <ns0:Timestamp>2012-03-14T10:54:31.701-05:00</ns0:Timestamp>
  </ns0:Reply>
</ns0:ResponseMessage>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ответы [ 4 ]

5 голосов
/ 09 марта 2012

Я нашел ответ.Это была проблема с сертификатами и конфигурацией.

Сертификаты Очевидно, мне понадобились два сертификата x.509, один для запроса и один для ответа.

  1. В проводнике дважды щелкните файл cer, чтобы открыть его.
  2. Перейдите на вкладку «Путь сертификации» и запишите иерархию
  3. Установите оба сертификата x.509 в папке «Персональные сертификаты».
  4. В MMC дважды щелкните сертификат, чтобы открыть его
  5. Нажмите на вкладку «Путь сертификации» и убедитесь, что путь соответствует пути в шаге 2

Сертификаты должныбыть правильно настроенным сейчас.

Конфигурация

Создайте поведение конечной точки в app.config и создайте удостоверение

<behaviors>
  <endpointBehaviors>
    <behavior name="myBehavior">   
      <clientCredentials>
        <clientCertificate findValue="#RequestCertificate#"                                
          storeLocation="CurrentUser"
         storeName="My"
          x509FindType="FindBySubjectName"/>
        <serviceCertificate>
          <authentication certificateValidationMode="ChainTrust"/>
          <defaultCertificate findValue="#ResponseCertificate#"
          storeLocation="CurrentUser"
           storeName="My"
          x509FindType="FindBySubjectName" />
        </serviceCertificate>
      </clientCredentials>          
    </behavior>

  <endpoint address="https://myaddress.com/" binding="customBinding"
            contract="mycontract"
            behaviorConfiguration="myBehavior"
            name="HttpEndPoint">
    <identity>
      <dns value="#ResponseCertificate" />
    </identity>        
  </endpoint>

где:

# RequestCertificate # - это имя вашего сертификата запроса

# ResponseCertificate # - это имя вашего сертификата ответа

1 голос
/ 29 мая 2012

Просто была похожая проблема, и думаю, что это может помочь другим траулерам:

В службу (политику) добавьте: <sp:RequireThumbprintReference/> под примером политики:

<wsp:Policy>
    <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-      securitypolicy/200702/IncludeToken/AlwaysToRecipient">
    <wsp:Policy>
        <sp:RequireThumbprintReference/>
        <sp:WssX509V3Token10/>
    </wsp:Policy>
    </sp:X509Token>
</wsp:Policy>

Это обеспечит правильность SecurityTokenReference

1 голос
/ 11 апреля 2012

Кейт. После того, как вы упомянули о chaintrust, я выглядел и низко, и вот, я использовал корневой сертификат моего сертификата API в качестве другого сертификата, против которого я пытался проверить ответ (я чувствую себя действительно глупо в этом вопросе).Затем я связался с правильным сертификатом и получил новую ошибку:

В заголовке безопасности нет метки времени для обнаружения повторов.

Чтобы исправить это, пришлось изменитьнемного измените свое пользовательское связывание, добавив тег «localClientSettings» под тегом «secureConversationBootstrap»

<binding name="NodalCustomBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
    receiveTimeout="00:10:00" sendTimeout="00:10:00"> 
  <textMessageEncoding messageVersion="Soap11" /> 
  <security 
    authenticationMode="MutualCertificate" 
    requireDerivedKeys="false" 
    includeTimestamp="true" 
     keyEntropyMode="ClientEntropy" 
    messageProtectionOrder="SignBeforeEncrypt" 
    messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" 
    requireSecurityContextCancellation="false" 
    allowSerializedSigningTokenOnReply="true" 
    enableUnsecuredResponse="true" > 
    <secureConversationBootstrap /> 
    <localClientSettings detectReplays="false"/>
  </security> 
  <httpsTransport /> 
</binding> 

Я сделал это в соответствии с рекомендацией http://social.msdn.microsoft.com/forums/en-US/wcf/thread/3be779e7-1d73-455c-8aa0-cb90026e8993/. Еще раз спасибо за помощь.Удивительно, как одно маленькое слово укажет тебе правильный путь.

0 голосов
/ 03 декабря 2018

Сертификат, о котором идет речь, может присутствовать в том же ответе SOAP.Я использовал программу Fiddler (бесплатная лицензия), чтобы прослушать ответ SOAP, и я получил сертификат в base64 внутри узла BinarySecurityToken.Я сохраняю его как .cer в блокноте, и я установил в соответствующем хранилище сертификатов.Затем настройте мой конфиг, и мой клиент Wcf работал нормально.

enter image description here

...