0

我有一些XML文档,每个文档都有大约 50 到 100 个单独的块/标签,需要使用 SHA256 单独烧写并发送到 Web 服务,所以我通过文档和节点创建了一个循环,得到了一切使用c#下面的代码注册。

一切都很顺利,因为我正在用智能卡测试它,甚至OK在 3 或 4 次期间得到服务器的“”响应,直到突然我的私钥变为空,然后我收到了来自 的禁止匿名登录消息WS,我几乎不知道我拿走了一个不同的证书,这次是一个 USB 令牌,同样的事情发生了,3 次、4 次就好了,然后又消失了!我真的不知道发生了什么或出了什么问题!有人有线索吗?谢谢。

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;
}
4

2 回答 2

1

key.PersistKeyInCsp = false意思是“当这个密钥对象被释放时,删除支持密钥材料”。因此,当垃圾收集在此方法之后进行清理时,它会执行您告诉它的操作:删除私钥。

由于对于智能卡,证书作为关联元数据存储在私钥容器中,这也会删除证书。

如果您删除该行代码,您的密钥/证书删除问题应该会消失。

于 2016-07-08T14:40:55.623 回答
0

我发现我只需要添加 CryptoConfig 那些。所以,我从循环中取出下面的行并将其放在表单上显示它解决了我的问题。

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureRSAMethod);
于 2016-06-02T20:39:22.370 回答