如何在自定义绑定中的defaultAlgorithmSuite中使用RSA-SHA512作为签名算法?

时间:2018-05-19 06:29:41

标签: c# wcf soap

我按照以下方式签署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#

但我未能在WCF中找到对SHA512的支持。有解决方法吗?

以下是我的代码:

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

1 个答案:

答案 0 :(得分:1)

我遇到的问题是不支持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 with SHA256

signedXml.SigningKey = RSACertificateExtensions.GetRSAPrivateKey(cert);

此外,如果您要将签名的前缀添加为ds,则需要从SignedInfo中删除引用,重新计算签名并将其添加回来。

Generate Digital Signature but with a Specific Namespace Prefix ("ds:")

我希望这有助于解决类似问题。