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

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

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

Я не ожидал этой ошибки, потому что я предоставил сервису только один сертификат 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>

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

<endpointBehaviors>
    <behavior name="NodalCredentialBehavior">   
      <clientCredentials>
        <clientCertificate findValue="Testx509"                                
          storeLocation="CurrentUser"
         storeName="My"
          x509FindType="FindBySubjectName"/>
        <serviceCertificate>
          <authentication certificateValidationMode="None"/>
          <defaultCertificate findValue="Testx509"
          storeLocation="CurrentUser"
           storeName="My"
          x509FindType="FindBySubjectName" />
        </serviceCertificate>
      </clientCredentials>          
    </behavior>
  </endpointBehaviors>

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

<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>

person KeithMacCrimmon    schedule 05.03.2012    source источник


Ответы (4)


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

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

  1. В проводнике дважды щелкните файл cer, чтобы открыть его.
  2. Перейдите на вкладку «Путь сертификации» и обратите внимание на иерархию.
  3. Установите оба сертификата x.509 в папку Personal Certificates.
  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# — это имя вашего сертификата ответа.

person KeithMacCrimmon    schedule 08.03.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/. Спасибо еще раз за помощь. Удивительно, как одно маленькое слово поставит вас на правильный путь.

person Tru Robertson    schedule 11.04.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

person mdipo    schedule 28.05.2012

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

введите здесь описание изображения

person MirlvsMaximvs    schedule 03.12.2018
comment
герой спас мой день спасибо! - person baaroz; 10.06.2021