17

Bir x.509 sertifikasını kullanarak bir XML dosyası imzalamaya çalışıyorum, belgeyi imzalamak için özel anahtarı kullanabilir ve sonra CheckSignature'ı kullanabilirim imzayı doğrulamak için yöntem (bir sertifikayı parametre olarak alan bir aşırı yük var).C# içinde x.509 sertifikalı bir xml imzalayın ve imzayı kontrol edin

Sorun, imzayı doğrulayan kullanıcının sertifikaya sahip olması, kaygımın, kullanıcının sertifikaya sahip olması durumunda özel anahtara erişimi olması ve anladığım kadarıyla bu özel olması ve kullanılabilir olması gerektiğidir. sadece işaret eden kullanıcıya.

Neyi eksik?

Yardımlarınız için teşekkürler.

cevap

5

Herhangi bir sertifikanın bir genel ve özel bir parçası vardır. Sadece halka açık kısımdan gönderirsin. Tarayıcınızdaki herhangi bir SSL etkin web sitesini açın, asma kilit simgesine tıklayın ve sertifikalarına bakın. NET'te

+0

Teşekkür ederim, tam olarak anlamadığım şey bu değildi. Artık "signer" sertifikasını almak için X509Store'dan bir sertifika kullanmam gerektiğini ve bir .cer dosyasını "verifier" olarak kullanmam gerektiğini biliyorum. – willvv

19

, böyle bir .pfx dosyasından X509 sertifika alırsanız:

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

Sonra şöyle genel anahtar bölümünü dışa aktarabilirsiniz:

rsaCsp.ToXmlString(false); 

" yanlış "bölüm diyor, sadece kamu parçasını ihraç et, özel parçayı ihraç etmeyin. (RSA.ToXmlString doc)

ve doğrulayıp uygulamasında,

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

kullanımı ve VerifyXml CheckSignature() çağırır. Bu şuna benzer:

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

Kod, http://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspx adresinde görünmektedir. Sanırım kodu buraya bağlamanız yerine buraya dahil etmeniz harika, ancak bunun için gereken yere kredi verin. –

0

Öncelikle sertifika .pfx veya kullandığınız .cer amacını imzalanması için tasarlanmıştır emin olmak için gereken tüm.

 
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** 

dijital/imzalamak C# XmlDocument doğrulamak için Eksiksiz konsol uygulaması

here yazılır.