wcf错误:使用与用于加密正文的令牌不同的令牌签名传入消息。这不是预期的

时间:2012-03-05 17:23:50

标签: wcf certificate wcf-security x509certificate

我正在尝试使用verisign测试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>

我的终点行为看起来像:

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

4 个答案:

答案 0 :(得分:5)

我找到了答案。这是证书和配置的问题。

<强>证书 显然,我需要两个x.509证书,一个用于请求,一个用于响应。

  1. 在资源管理器中,双击您的cer文件将其打开。
  2. 单击“证书路径”选项卡并记下层次结构
  3. 在Personal Certificates文件夹中安装两个x.509证书。
  4. 在MMC中,双击证书将其打开
  5. 单击“证书路径”选项卡,确保路径与步骤2中的路径匹配
  6. 现在应该正确设置证书。

    配置

    在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 :(得分:1)

Keith在你提到chaintrust之后,我看起来很低,看到我正在使用我的API证书的根证书作为我试图验证响应的另一个证书(我觉得这一点真的很愚蠢)。然后我链接到正确的证书并得到一个新的错误:

安全标头中没有可用于重放检测的时间戳。

要解决此问题,必须在“secureConversationBootstrap”标记下添加“localClientSettings”标记,稍微修改自定义绑定

<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/的推荐做到的。再次感谢您的帮助。令人惊讶的是,一个小词会让你走上正确的道路。

答案 2 :(得分:1)

刚遇到类似的问题,并认为这可以帮助其他线程拖网渔船:

在服务(策略)中,在政策示例下添加:<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

的正确性

答案 3 :(得分:0)

它所争论的证书可能存在于同一SOAP响应中。我使用Fiddler(免费软件许可)程序来嗅探SOAP响应,并且在节点BinarySecurityToken中的base64中获得了证书。我将其另存为.cer在记事本中,并安装在正确的证书存储区中。然后设置我的配置,我的Wcf客户端运行正常。

enter image description here