Клиент WCF - Указание алгоритма подписи для подписи метки времени WS-Security - PullRequest
9 голосов
/ 20 февраля 2012

У меня есть клиент WCF, который отправляет сообщение службе, отличной от WCF, и у этой службы возникают проблемы при обработке метода подписи HMAC-SHA1, используемого для подписи элемента Timestamp WS-Security. В идеале мы хотели бы использовать метод подписи RSA-SHA1, но я не смог заставить WCF использовать этот метод подписи.

Используемая мной привязка - это настраиваемая привязка, позволяющая отправлять токен SAML 2.0 через 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>

Подпись в исходящем запросе выглядит так:

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

Обратите внимание, что <SignatureMethod> равно http://www.w3.org/2000/09/xmldsig#hmac-sha1

Одна интересная вещь заключается в том, что алгоритм HMAC-SHA1 является симметричным (один ключ для шифрования и дешифрования), тогда как RSA-SHA1 является асимметричным (требуется один ключ для шифрования и один для дешифрования). Я думаю, что WCF использует алгоритм HMAC-SHA1, потому что он симметричен, и обмен токеном SAML является общим секретом (ключом). Имеет смысл использовать токен SAML в качестве общего ключа для симметричного алгоритма, но есть ли возможность заставить WCF использовать асимметричный алгоритм, такой как RSA-SHA1?

Мне удалось немного изменить метод подписи, изменив атрибут binding / security / defaultAlgorithmSuite, но различные опции не дают мне возможности указать RSA-SHA1 здесь:

defaultAlgorithm = По умолчанию:

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

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

Есть ли способ заставить WCF использовать RSA-SHA1 в подписи метки времени?

1 Ответ

0 голосов
/ 19 сентября 2014

Я думаю, что это проблема совместимости.Аналогичная проблема есть в приведенной ниже ссылке.

http://www.fokkog.com/2011/01/ws-security-interoperability-issue.html

Вы можете вручную создать и подписать токен.Проверьте это сообщение:

Как заставить клиента WCF соответствовать определенному WS-Security - подписать UsernameToken и SecurityTokenReference

...