2016-04-27 19 views
0

Ich hatte ein paar XML Dokumente, jeder hat etwa 50 bis 100 einzelne Blöcke/Tags, die einzeln mit SHA256 verpfändet und an einen Webdienst gesendet werden mussten, also habe ich eine Schleife durch die Dokumente und durch die Knoten gemacht, habe alles mit c# Code unten eingetragen.Das Zertifikat wurde beim Signieren von XML aus Smartcard/Token gelöscht. Wie ist das möglich?

Alles lief gut, als ich es mit einer Smartcard prüfte, bekam sogar die "OK" Antwort vom Server während 3 oder 4 Mal, bis plötzlich mein privater Schlüssel null wurde, dann bekam ich die verbotene anonyme Login-Nachricht von WS, ich wusste nicht, dass ich ein anderes Zertifikat genommen habe, dieses Mal ein USB Token, und dasselbe ist passiert, gut für 3, 4 Mal und dann wieder weg! Ich weiß wirklich nicht was los ist oder was schiefgelaufen ist! Hat jemand Ahnung? Vielen Dank.

PS: Bevor es funktioniert nicht die signer.ComputeSignature(); Methode für Passwort wurde gefragt, jetzt die Ausnahme seiner auf:

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

Ich habe auch die Cert-Manager safeNet (Token) und safeSign Standart (Smartcard) überprüft und es gibt keinen privaten Schlüssel oder Zertifikat auf beiden. – Marisco

+0

weiß nicht, was sonst zu tun, RCA-Funktion wurde von Server korrekt, so dass ich das Problem verursacht, ich habe geändert, um http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 und fügen Sie die Signatur ein, die http://www.w3.org/2000/09/xmldsig#enveloped-signature umhüllte, wie sie mir gesagt haben, das Gleiche passiert. Pls irgendeine Idee? – Marisco

Antwort

0

Ich habe herausgefunden, dass ich nur auf den CryptoConfig diejenigen hinzufügen müssen. Also, ich nahm die Zeile unten aus der Schleife und legte sie auf Formular zeigen, löste es mein Problem.

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

key.PersistKeyInCsp = false bedeutet „Wenn diese Taste Objekt freigegeben wird, die das Sichern Schlüsselmaterial löschen“. Wenn die Garbage Collection nach dieser Methode aufräumt, tut sie das, was Sie ihr gesagt haben: Löschen Sie den privaten Schlüssel.

Da das Zertifikat für eine Smartcard innerhalb des privaten Schlüsselcontainers als zugeordnete Metadaten gespeichert ist, wird auch das Zertifikat gelöscht.

Wenn Sie diese Codezeile entfernen, sollten Ihre Probleme beim Löschen von Schlüsseln/Zertifikaten verschwinden.