2012-02-20 19 views
9

Ho un client WCF che sta inviando un messaggio a un servizio non WCF e tale servizio ha problemi nella gestione del metodo di firma HMAC-SHA1 utilizzato per firmare il WS -Security Timestamp element. Idealmente, vorremmo usare il metodo di firma RSA-SHA1, ma non sono stato in grado di ottenere che WCF usasse quel metodo di firma.- Specifica dell'algoritmo della firma per la firma WS-Security Timestamp

Il legame che sto usando è una consuetudine vincolante che mi permette di inviare un 2,0 token SAML su HTTPS:

<customBinding> 
    <!-- This binding is a WS2007FederationHttpBinding without Secure Sessions that uses Text message encoding. --> 
    <binding 
     name="WS2007FederationHttpBinding_NoSecureSession_Text" 
     closeTimeout="00:01:00" 
     openTimeout="00:01:00" 
     receiveTimeout="00:10:00" 
     sendTimeout="00:01:00"> 
     <security 
      authenticationMode="IssuedTokenOverTransport" 
      requireSignatureConfirmation="true" 
      securityHeaderLayout="Lax" 
      messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" 
      keyEntropyMode="CombinedEntropy" 
      includeTimestamp="true"> 
      <issuedTokenParameters 
       tokenType="urn:oasis:names:tc:SAML:2.0:assertion"> 
       <!-- This describes the STS. That is, the URL, the binding to use, and its Identity --> 
       <issuer 
        address="http://hostname//STS.svc" 
        binding="ws2007HttpBinding" 
        bindingConfiguration="StsUserNameBindingConfiguration"> 
        <identity> 
         <!-- This is the certificate used for signing on the STS. --> 
         <!-- Replace "sts-signing-certificate-thumbprint" with the actual thumbprint of the STS's signing certificate --> 
         <certificateReference 
          findValue="sts-signing-certificate-thumbprint" 
          storeLocation="LocalMachine" 
           storeName="My" 
           x509FindType="FindByThumbprint"/> 
        </identity> 
       </issuer> 
      </issuedTokenParameters> 

      <!-- This basically says "Don't use Secure Conversation" --> 
      <secureConversationBootstrap/> 
     </security> 

     <!-- Use Text Encoding --> 
     <textMessageEncoding/> 

     <!-- This says to use HTTPS when communicating with the remote service --> 
     <httpsTransport 
      requireClientCertificate="true" 
      maxBufferPoolSize="134217728" 
      maxReceivedMessageSize="134217728" 
      maxBufferSize="134217728"/> 
    </binding> 
</customBinding> 

La firma nella richiesta in uscita si presenta così:

<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#hmac-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>GZfW1RkyS4DHYFPHRnRuqNSo+qE=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>rMzQ/kEV7AXcO3wm9hfQXNoX5r4=</SignatureValue> 
    <KeyInfo> 
     <o:SecurityTokenReference 
      b:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" 
      xmlns:b="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"> 
      <o:KeyIdentifier 
       ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_9f79359e-63dc-4e38-888c-6567dac4b41b</o:KeyIdentifier> 
     </o:SecurityTokenReference> 
    </KeyInfo> 
</Signature> 

Notare che

Una cosa interessante è che l'algoritmo HMAC-SHA1 è simmetrico (una chiave per crittografare e decodificare) mentre RSA-SHA 1 è asimmetrico (richiede una chiave per crittografare e una per decifrare). Penso che WCF usi l'algoritmo HMAC-SHA1 perché è simmetrico e il token SAML che viene scambiato è il segreto condiviso (chiave). Ha senso utilizzare il token SAML come chiave condivisa per un algoritmo simmetrico, ma esiste un'opzione disponibile per forzare WCF a utilizzare un algoritmo asimmetrico come RSA-SHA1?

sono stato in grado di ottenere qualche leggera modifica del metodo di firma cambiando il legame/security/defaultAlgorithmSuite attributo, ma le varie opzioni non mi danno la possibilità di specificare RSA-SHA1 qui:

defaultAlgorithm = Default :

<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>

defaultAlgorithm = Basic256:

<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>

defaultAlgorithm = Basic256Rsa15:

<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>

defaultAlgorithm = Basic256Sha256:

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"/> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

defaultAlgorithm = Basic256Sha256Rsa15: 012.304.736,091 mila

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"/> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

C'è un modo per forzare WCF per utilizzare RSA-SHA1 sulla firma timestamp?

risposta

Problemi correlati