我有几个XML
文档,每个文档有大约50到100个单独的块/标签,需要使用SHA256单独查找并发送到Web服务,所以我通过文档和节点,使用下面的c#
代码注册所有内容。
一切顺利,因为我用智能卡测试它,甚至得到了" OK
" 3到4次来自服务器的响应,直到我的私钥变为空,然后我从WS
得到了禁止的匿名登录消息,我知道我拿了一个不同的证书,这次是一个USB令牌,同样的事情发生了,罚了3次,然后再次去了!我真的不知道发生了什么或出了什么问题!有人有线索吗?感谢。
PS:在它停止工作之前,signer.ComputeSignature();
方法要求输入密码,现在是例外情况:
var key = (RSACryptoServiceProvider)pCertificado.PrivateKey;
key.PersistKeyInCsp = false;
public string SignSHA256(string pDocument, string id, X509Certificate2 pCertificado)
{
string signatureCn14Transform = @"http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
string signatureMethod = @"http://www.w3.org/2000/09/xmldsig-more#rsa-sha256";
string digestMethod = @"http://www.w3.org/2001/04/xmlenc#sha256";
string signatureReferenceURI = "#" + id;
CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureMethod);
XmlDocument xmlDocToSign = new XmlDocument();
xmlDocToSign.LoadXml(pDocument);
SignedXml signer = new SignedXml(xmlDocToSign);
var key = (RSACryptoServiceProvider)pCertificado.PrivateKey;
key.PersistKeyInCsp = false;
signer.SigningKey = key;
signer.SignedInfo.SignatureMethod = signatureMethod;
Reference reference = new Reference();
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform();
cn14Transform.Algorithm = signatureCn14Transform;
reference.AddTransform(cn14Transform);
reference.Uri = signatureReferenceURI;
reference.DigestMethod = digestMethod;
signer.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(pCertificado));
signer.KeyInfo = keyInfo;
signer.ComputeSignature();
xmlDocToSign.DocumentElement.AppendChild(signer.GetXml());
return xmlDocToSign.OuterXml;
}
答案 0 :(得分:1)
key.PersistKeyInCsp = false
表示"当此关键对象被释放时,删除支持密钥材料"。因此,当垃圾收集在此方法之后清理时,它会执行您告诉它的操作:删除私钥。
因为对于智能卡,证书作为关联元数据存储在私钥容器中,这也会删除证书。
如果删除该行代码,您的密钥/证书删除问题就会消失。
答案 1 :(得分:0)
我已经发现我只需要添加CryptoConfig。所以,我从循环中取下面的一行并把它放在表格上显示它解决了我的问题。
CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureRSAMethod);