gpt4 book ai didi

.net - SHA256 签名在 .NET 4.5 中停止工作

转载 作者:行者123 更新时间:2023-12-03 14:07:45 25 4
gpt4 key购买 nike

我们有一段代码创建了一个 SigningCredentials 对象,用于使用 SHA256 算法对 xml 文档进行签名。它与 .NET 3.5 完美配合。但是,当我们将代码库升级到 .NET 4.5 时,它就会停止工作。相同的代码,相同的证书!我花了几个小时在互联网上调试和搜索,但没有任何运气。

谁能告诉我这里的问题是什么?先感谢您。

创建 SigningCredentials 的代码:

public SigningCredentials CreateSigningCredentials(X509Certificate2 cert)
{
var ski = new SecurityKeyIdentifier(new X509RawDataKeyIdentifierClause(cert));
return new SigningCredentials(new X509AsymmetricSecurityKey(cert), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", "http://www.w3.org/2001/04/xmlenc#sha256", ski);
}

异常(exception):
[CryptographicException: Invalid algorithm specified.
]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +41
System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 cbHash, ObjectHandleOnStack retSignature) +0
System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash) +118
System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash) +334
System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash) +321
System.IdentityModel.SignedXml.ComputeSignature(HashAlgorithm hash, AsymmetricSignatureFormatter formatter, String signatureMethod) +323
System.IdentityModel.SignedXml.ComputeSignature(SecurityKey signingKey) +690
System.IdentityModel.EnvelopedSignatureWriter.ComputeSignature() +338
System.IdentityModel.EnvelopedSignatureWriter.OnEndRootElement() +278
System.IdentityModel.Metadata.MetadataSerializer.WriteEntityDescriptor(XmlWriter inputWriter, EntityDescriptor entityDescriptor) +1109

最佳答案

XmlDsig 有同样的问题(试图用 RSA-SHA256 算法对 xml 文档进行封装签名)。
首先我得到了异常(exception)

System.Security.Cryptography.CryptographicException: SignatureDescription could not be created for the signature algorithm supplied.



然后我发现提到 RSAPKCS1SHA256SignatureDescription - RSA-SHA256 签名的签名描述实现。
此处完整实现: http://clrsecurity.codeplex.com/SourceControl/changeset/view/47833#269110
或在这里: https://gist.github.com/sneal/f35de432115b840c4c1f

您必须为每个 appdomain 手动调用一次:
CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

之后我得到了一个新的异常(exception):

System.Security.Cryptography.CryptographicException: Invalid algorithm specified.



这让我想到了你的问题。看完建议 article我使用 Microsoft Enhanced RSA and AES Cryptographic Provider 创建了一个新的 key 和证书(使用 OpenSSL) .
令我惊讶的是,这个新证书使我能够成功地进行签名。

经过更多调查后,我在这里找到了 Andrew 的有趣答案 https://stackoverflow.com/a/17285774/328785 ,他在哪里使用 RSACryptoServiceProviderSignedXml 准备 SecretKey类(class)。
特别是这部分(我的解释):
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, "54dba096", true);
var certificate = certificates[0];

// next three lines
var cspParams = new CspParameters(24) { KeyContainerName = "XML_DSIG_RSA_KEY" };
var key = new RSACryptoServiceProvider(cspParams);
key.FromXmlString(certificate.PrivateKey.ToXmlString(true));

SignedXml sxml = new SignedXml(doc);
sxml.SigningKey = key;

即使使用旧 key ,这个解决方案也能正常工作!

关于.net - SHA256 签名在 .NET 4.5 中停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19620970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com