在签署XML时从智能卡/令牌中删除了证书。那可能怎么样?

问题描述:

我有几个XML文档,每个文档都有大约50到100个独立块/标签,需要使用SHA256单独烧录并发送到Web服务,所以我通过文档和节点进行了循环,全部使用下面的代码c#注册。在签署XML时从智能卡/令牌中删除了证书。那可能怎么样?

一切都进行得很顺利,因为我是用智能卡测试它,甚至得到了来自服务器的“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; 
} 
+0

我还检查了Cert manager safeNet(令牌)和safeSign standart(智能卡),并且两者都没有私钥或证书。 – Marisco

+0

不知道还有什么要做,RCA功能是正确的服务器,所以我虽然这导致了问题,我已经改为http://www.w3.org/2001/04/xmldsig-more#rsa-sha256并像他们告诉我一样添加签名http://www.w3.org/2000/09/xmldsig#enveloped-signature,同样的事情发生。有什么想法? – Marisco

我已经想通了,我只需要在CryptoConfig那些添加。所以,我从循环中取出下面的一行,并将它放在窗体上显示它解决了我的问题。

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureRSAMethod); 

key.PersistKeyInCsp = false表示“当该键对象被释放时,删除备份键材料”。所以当垃圾回收在这个方法之后清理时,它会按照你所说的去做:删除私钥。

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

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