Как использовать RSA-SHA512 в качестве алгоритма подписи в defaultAlgorithmSuite в пользовательских привязках? - PullRequest
0 голосов
/ 19 мая 2018

Я подписываю XML согласно: Алгоритм подписи: http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 Алгоритм дайджеста: http://www.w3.org/2001/04/xmlenc#sha512 Алгоритм канонизации: http://www.w3.org/2001/10/xml-exc-c14n#

Но мне не удалось найти поддержкудля SHA512 в WCF.Есть ли обходной путь к этому?

Ниже мой код:

<customBinding>
    <binding name="McBinding">
         <textMessageEncoding messageVersion="Soap11" />
        <security authenticationMode="MutualCertificate" includeTimestamp="false" defaultAlgorithmSuite="??"
            messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
            <secureConversationBootstrap />
        </security>
        <httpsTransport />
    </binding>

1 Ответ

0 голосов
/ 26 мая 2018

У меня были проблемы с отсутствием поддержки алгоритма подписи RSA-SHA512.Это может быть достигнуто с помощью алгоритма пользовательской подписи.Затем добавьте его в Алгоритм подписи по умолчанию в вашей пользовательской привязке.

 public class MyCustomAlgorithmSuite : SecurityAlgorithmSuite { }

Также создайте для него подпись как:

public class RsaPkCs1Sha512SignatureDescription : SignatureDescription
{}

Затем добавьте его в:

CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha512SignatureDescription),
            "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512");

Однако мы столкнулись с проблемой подписания токена BinarySecurity.Его можно подписать, добавив:

assymetricKey.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters());

Однако это создаст новый подписанный двоичный токен безопасности, и вы получите два BST.Решение этого заключается в следующем:

            assymetricKey.InitiatorTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.Never};
        assymetricKey.RecipientTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.Never};

Это портит вашу SignedInfo, чтобы потерять ссылку на BST, и мы застряли.

В любом случае мы в конечном итоге не использовали возможности WCF и вместо этого использовали:

SignedXML class.

Для ссылки на то, как его использовать, есть ссылка: https://gist.github.com/luizvaz/43ccbd85b16b6802218b50b6d34c26de

Также,Следует отметить, что если вы реализуете алгоритм подписи RSA-SHA512 из сертификата, то вам нужно будет использовать метод расширения (обязательно используйте .net 4.6.2 или выше).Для старых версий:

SignedXml Compute Signature с SHA256

signedXml.SigningKey = RSACertificateExtensions.GetRSAPrivateKey(cert);

Кроме того, если вы добавляете префикс к подписи как ds, вам необходимо удалитьссылки из SignedInfo, пересчитать подпись и добавить ее обратно.

Создать цифровую подпись, но с определенным префиксом пространства имен ("ds:")

Надеюсьэто помогает иметь подобные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...