2017-05-10 1 views
6

Ich habe einen Client für einen Webdienst, den ich mithilfe eines Visual Studio-Dienstverweis über WSDL entwickelt habe. Es ist konfiguriert, Anforderungen mit einem Zertifikat zu signieren und kann Anfragen an den Service senden, aber der Dienst antwortet mit einem Fehler 400 - Bad Request, da es eine zusätzliche Signatur zusätzlich zu der gewünschten gibt, mit mehreren <Reference> Tags, die verwendet HMAC-SHA1 als seine Signaturmethode. Der HMAC-SHA1 wird vom Web-Service nicht unterstützt und daher wird die Anfrage abgelehnt. Aber ich will oder brauche diese Unterschrift nicht und ich bin mir nicht sicher, woher sie kommt. Im Folgenden ist meine Bindungskonfiguration:SOAP-Service-Client, der mit WSDL generiert wurde, nur Signierungskörper konfigurieren

<customBinding> 
    <binding name="mainBinding"> 
    <security authenticationMode="MutualCertificate" 
       allowSerializedSigningTokenOnReply="true" 
       requireDerivedKeys="false" 
       requireSignatureConfirmation="false"/> 
    <httpsTransport /> 
    </binding> 
</customBinding> 

Ich habe ProtectionLevel = System.Net.Security.ProtectionLevel.Sign als Teil des ServiceContractAttribute auch.

Welcher Teil meiner Konfiguration verursacht die zweite Signatur? Wie kann ich die Konfiguration ändern, damit ich eine Signatur in meinen Anfragen habe?

EDIT:

Unten ist die Anfrage, die gesendet wird. Um den unerwünschten Teil hervorzuheben, habe ich ihn in Abschnitte aufgeteilt, aber in Wirklichkeit ist alles zusammenhängend.

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1" u:Id="_1">[removed]</a:Action> 
     <a:MessageID u:Id="_2">[removed]</a:MessageID> 
     <a:ReplyTo u:Id="_3"> 
      <a:Address>[removed]</a:Address> 
     </a:ReplyTo> 
     <a:To s:mustUnderstand="1" u:Id="_4">[removed]</a:To> 
     <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <u:Timestamp u:Id="[removed]"> 
       <u:Created>2017-05-11T08:59:25.681Z</u:Created> 
       <u:Expires>2017-05-11T09:04:25.681Z</u:Expires> 
      </u:Timestamp> 
      <e:EncryptedKey Id="[removed]" xmlns:e="http://www.w3.org/2001/04/xmlenc#"> 
       [removed] 
      </e:EncryptedKey> 
      <o:BinarySecurityToken u:Id="[removed]" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">[removed]</o:BinarySecurityToken> 

Anfang Teil will ich nicht

  <Signature Id="_0" xmlns="http://www.w3.org/2000/09/xmldsig#"> 
       <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/> 
        <Reference URI="#_1"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
        <Reference URI="#_2"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
        <Reference URI="#_3"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
        <Reference URI="#_4"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
        <Reference URI="[removed]"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
       </SignedInfo> 
       <SignatureValue>[removed]</SignatureValue> 
       <KeyInfo> 
        <o:SecurityTokenReference> 
         <o:Reference URI="[removed]"/> 
        </o:SecurityTokenReference> 
       </KeyInfo> 
      </Signature> 

Ende Teil will ich nicht

  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
       <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="#_0"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>[removed]</DigestValue> 
        </Reference> 
       </SignedInfo> 
       <SignatureValue>[removed]</SignatureValue> 
       <KeyInfo> 
        <o:SecurityTokenReference> 
         <o:Reference URI="[removed]"/> 
        </o:SecurityTokenReference> 
       </KeyInfo> 
      </Signature> 
     </o:Security> 
    </s:Header> 
    <s:Body> 
     [removed] 
    </s:Body> 
</s:Envelope> 

EDIT 2:

Nach etwas graben und lesen verstehe ich jetzt, dass die beiden Signaturen Signaturen für den Körper und den Header sind. I nur möchte den Körper unterschreiben. Ich habe den Titel entsprechend geändert.

Antwort

0

Ich habe es endlich geschafft, das selbst zu lösen. Ich hatte verbindliche Sicherheit in meiner app.config konfiguriert, aber dies scheint standardmäßig symmetrische Sicherheit, daher die HMAC-SHA1, die AES, ein symmetrischer Algorithmus verwendet. Anstatt in app.config zu konfigurieren, habe ich meine eigene Bindung mit AsymmetricSecurity (siehe unten) erstellt. Dies bedeutete, dass Signaturen RSA, einen asymmetrischen Algorithmus anstelle von AES, verwendeten und der Remoteserver die Anfrage schließlich akzeptierte.

AsymmetricSecurityBindingElement asbe = new AsymmetricSecurityBindingElement 
{ 
    MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10, // Or WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10 ? 
    InitiatorTokenParameters = new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient }, 
    RecipientTokenParameters = new X509SecurityTokenParameters(), 
    SecurityHeaderLayout = SecurityHeaderLayout.Strict, 
    IncludeTimestamp = true, 
    DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15, 
    AllowSerializedSigningTokenOnReply = true 
}; 
asbe.SetKeyDerivation(false); // What is it for? 
asbe.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient }); 

CustomBinding binding = new CustomBinding(); 
binding.Elements.Add(asbe); 
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8)); 
binding.Elements.Add(new HttpsTransportBindingElement 
{ 
    MaxReceivedMessageSize = 1024 * 1024 
}); 

Client.Endpoint.Binding = binding; 
Verwandte Themen