加密许可模块无法在网站上运行?

时间:2010-12-02 10:35:25

标签: c# asp.net cryptography digital-signature

我们开发了一种小方法,从签名的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 个答案:

答案 0 :(得分:1)

我猜网络服务器作为另一个用户运行而不是命令行工具。除非您使用CspProviderFlags.UseMachineKeyStore,否则CspParameters将默认使用用户密钥库。如果指定的密钥容器不存在,RsaCryptoServiceProvider将静默生成新密钥,因此结果是您的代码使用不同的密钥来验证何时在Web服务器中运行,而不是从命令行运行时