Модуль криптографического лицензирования не работает с веб-сайта? - PullRequest
0 голосов
/ 02 декабря 2010

Мы разработали небольшой метод, который извлекает криптографический ключ из подписанного XML-документа, а затем проверяет подпись с помощью метода SignedXml.CheckSignature.

При запуске из приложения командной строки ключ проверяется правильно. Однако, как только я звоню из веб-приложения, он перестает работать. Кто-нибудь знает, что может происходить?:

    // Verify the signature of an XML file against an asymmetric 
    // algorithm and return the result.XmlDocument Doc, RSA Key
    public static Boolean VerifyLicenceFile(string xmlLicFilePathArg)
    {
        bool isVerified = false;

        try
        {

            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = containerName;

            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new XML document.
            XmlDocument xmlDoc = new XmlDocument();

            // Load an XML file into the XmlDocument object.
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(xmlLicFilePathArg);


            // Check arguments.
            if (xmlDoc == null)
                throw new ArgumentException("Doc");
            if (rsaKey == null)
                throw new ArgumentException("Key");

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(xmlDoc);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            XmlNodeList nodeList = xmlDoc.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.");
            }

            // This example 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.
            isVerified = signedXml.CheckSignature(rsaKey);
        }
        catch (Exception ex)
        { 
        }

        return isVerified;

    }

1 Ответ

1 голос
/ 03 декабря 2010

Я полагаю, что веб-сервер работает от имени другого пользователя, а не из командной строки.Если вы не используете CspProviderFlags.UseMachineKeyStore, CspParameters по умолчанию будет использовать хранилище ключей пользователя.RsaCryptoServiceProvider автоматически генерирует новый ключ, если указанный контейнер-ключ не существует, поэтому в результате ваш код использует другой ключ для проверки при запуске на веб-сервере, чем при запуске из командной строки.1006 *

...