我数字签名一个XML文档,并验证它在2台不同的机器(在一台机器注册它和验证在另一个)。

我做以下,以验证在CSharp.Net的XML DSIG。

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

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

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

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

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

起初我是越来越PermissionDenied异常,当我的web应用程序试图访问密钥容器。不过我有暂时应用程序用户和IIS用户管理员角色和分配FullTrust安全策略添加到使用CasPol我的Web应用程序。

Q1:我的第一个问题是什么是过度来最好的办法] ??我知道指定的Web应用程序fulltrust和将用户添加到管理员角色是不是一个好主意,即使它的工作原理

我的第二个问题是关于signedXml.CheckSignature(rsaKey);返回false。现在按照我的理解,因为XML文档进行数字不同的机器的MAC用来签署签署存储在该机器密钥容器名称“XML_DSIG_RSA_KEY”,但是当我试图验证主机上的签名不同的MAC是主机上,产生并存储在容器名称“XML_DSIG_RSA_KEY”,因此,数字签名没有得到验证。

<强> Q2:这是假设是正确?什么是应对的最佳方式......我应该使用证书进行数字签名的XML文档,然后验证它,在这种情况下。应该我需要陪与DSIG XML文档的证书。???

有帮助吗?

解决方案

要先回答你的第二个问题:你想验证与公共部分的那个用于签署它的RSA密钥对。所以,你需要或者已经拥有的(信任)的验证机上或发送包含与XML的公钥证书的公钥(它可存储在XML签名结构里面),然后确认证书已由受信任的证书授权机构发出的。

要实现第一种情况下,你可以调用ToXmlString(false)上发送侧的按键,结果存储在一个文件中,并保持该文件的接收方。然后在接收端,读出的文件,并调用:

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

在第二情况下,通过获取证书,并且将其添加到签名上的签字侧这样来完成:

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

如果该证书是可信的,则随后可以通过只调用验证在接收侧的签名:

bool isDone = signedXml.CheckSignature();

要回答你的第一个问题:一旦你不再试图访问私有密钥存储,你应该能够在不完全信任运行(你被调用的RSACryptoServiceProvider构造函数像你这样做)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top