我按照以下方式签署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>
答案 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:")
我希望这有助于解决类似问题。