17

J'essaye de signer un fichier XML en utilisant un certificat x.509, je peux utiliser la clé privée pour signer le document, puis utiliser la CheckSignature méthode (il a une surcharge qui reçoit un certificat en paramètre) pour vérifier la signature. Le problème est que l'utilisateur qui valide la signature doit avoir le certificat, mon souci est, si l'utilisateur a le certificat, alors il a accès à la clé privée, et si je comprends bien, c'est privé et devrait être disponible seulement à l'utilisateur qui signe.En C#, signez un xml avec un certificat x.509 et vérifiez la signature

Qu'est-ce qui me manque?

Merci pour votre aide.

Répondre

5

Tout certificat comporte une partie publique et une partie privée. Vous n'envoyez que la partie publique. Ouvrez simplement un site Web compatible SSL dans votre navigateur, cliquez sur le symbole du cadenas et consultez leur certificat.

+0

Merci, c'est exactement ce que je n'ai pas compris. Maintenant, je sais que je dois utiliser un certificat du X509Store pour obtenir le certificat "signataire", et utiliser un fichier .cer comme "vérificateur". – willvv

19

Dans .NET, Si vous obtenez votre X509 cert à partir d'un fichier .pfx, comme ceci:

X509Certificate2 certificate = new X509Certificate2(certFile, pfxPassword); 
RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider) certificate.PrivateKey; 

Ensuite, vous pouvez exporter la partie clé publique comme ceci:

rsaCsp.ToXmlString(false); 

Le " fausse "partie dit, seulement exporter la pièce publique, ne pas exporter la pièce privée. (Doc pour RSA.ToXmlString)

Et puis dans l'application de vérification, utilisez

RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); 
csp.FromXmlString(PublicKeyXml); 
bool isValid = VerifyXml(xmlDoc, rsa2); 

Et le VerifyXml appelle CheckSignature(). Il ressemble à ceci:

private Boolean VerifyXml(XmlDocument Doc, RSA Key) 
{ 
    // Create a new SignedXml object and pass it 
    // the XML document class. 
    var signedXml = new System.Security.Cryptography.Xml.SignedXml(Doc); 

    // Find the "Signature" node and create a new XmlNodeList object. 
    XmlNodeList nodeList = Doc.GetElementsByTagName("Signature"); 

    // Throw an exception if no signature was found. 
    if (nodeList.Count <= 0) 
    { 
     throw new CryptographicException("Verification failed: No Signature was found in the document."); 
    } 

    // Though it is possible to have multiple signatures on 
    // an XML document, this app only supports one signature for 
    // the entire XML document. Throw an exception 
    // if more than one signature was found. 
    if (nodeList.Count >= 2) 
    { 
     throw new CryptographicException("Verification failed: More that one signature was found for the document."); 
    } 

    // Load the first <signature> node. 
    signedXml.LoadXml((XmlElement)nodeList[0]); 

    // Check the signature and return the result. 
    return signedXml.CheckSignature(Key); 
} 
+2

Le code semble provenir de http://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspx. Je pense que c'est cool que vous incluiez le code ici au lieu de simplement le lier, mais donnez du crédit là où il est dû. –

0

Tout d'abord tout ce que vous devez être sûr que le certificat .pfx ou .cer que vous utilisez est destiné à la signature fin.

 
You can check same in General Tab of a certificate 

*.Proves your identity to a remote computer 
*.Protects e-mail messages 
*.Allows data to be signed with the current time 
*.Allows data on disk to be encrypted 
*.2.16.356.100.2 
**Document Signing** 

Une application complète de la console pour signer numériquement/vérifier XmlDocument en C# est écrit here.

Questions connexes