В C # подпишите xml сертификатом x.509 и проверьте подпись

Я пытаюсь подписать XML-файл с помощью сертификата x.509, я могу использовать закрытый ключ для подписи документа, а затем использовать метод CheckSignature (у него есть перегрузка, которая получает сертификат в качестве параметра) для проверки подписи.

Проблема в том, что пользователь, который проверяет подпись, должен иметь сертификат, меня беспокоит, что если у пользователя есть сертификат, то у него есть доступ к закрытому ключу, и, как я понимаю, он является частным и должен быть доступен только пользователю. кто подписывает.

Что мне не хватает?

Спасибо за вашу помощь.


person willvv    schedule 28.07.2009    source источник


Ответы (3)


В .NET, если вы получаете сертификат X509 из файла .pfx, например:

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

Затем вы можете экспортировать часть открытого ключа следующим образом:

 rsaCsp.ToXmlString(false);

«Ложная» часть говорит: экспортируйте только общедоступную часть, не экспортируйте частную часть. (документ для RSA.ToXmlString)

А затем в проверяющем приложении используйте

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

И VerifyXml вызывает CheckSignature(). Выглядит это примерно так:

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);
}
person Cheeso    schedule 29.07.2009
comment
Код, похоже, взят с msdn.microsoft.com /en-us/library/ms229950(v=vs.110).aspx. Я думаю, это круто, что вы включаете код здесь, а не просто на него ссылаетесь, но отдавайте должное там, где это необходимо. - person Jan Aagaard; 09.07.2014

Любой сертификат имеет публичную и приватную часть. Вы рассылаете только публичную часть. Просто откройте любой веб-сайт с поддержкой SSL в своем браузере, нажмите на символ замка и посмотрите на его сертификат.

person chris166    schedule 28.07.2009
comment
Спасибо, это именно то, чего я не понял. Теперь я знаю, что мне нужно использовать сертификат из X509Store, чтобы получить сертификат подписавшего, и использовать файл .cer в качестве верификатора. - person willvv; 28.07.2009

Прежде всего, вам нужно убедиться, что сертификат .pfx или .cer, который вы используете, предназначен для подписания.

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

Полное консольное приложение для цифровой подписи / проверки XmlDocument на C # написано здесь.

person Raj kumar    schedule 29.09.2015