Вопрос

Я подписываю документ XML цифровой подписью и проверяю его на 2 разных машинах (подписываю его на одной машине и проверяю на другой).

Я делаю следующее, чтобы проверить XML DSIG в CSharp.Net .

        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;
        }

Изначально я получал исключение с разрешениями, когда мое веб-приложение пыталось получить доступ к контейнеру ключей.Однако у меня есть временно добавьте пользователя приложения и пользователя IIS к роли администратора и назначьте политику безопасности FullTrust моему веб-приложению с помощью CasPol.

Q1:[Мой первый вопрос заключается в том, каков наилучший способ преодолеть это]??Я знаю, что присвоение веб-приложению полного доверия и добавление пользователя к роли администратора - не самая лучшая идея, хотя это и работает

Мой второй вопрос касается signedXml.CheckSignature(rsaKey); возвращает значение false.Теперь, насколько я понимаю, поскольку XML-документ имеет цифровую подпись на другом компьютере, MAC, используемый для его подписи, хранится на этом компьютере с КЛЮЧЕВЫМ именем контейнера "XML_DSIG_RSA_KEY", но когда я попытался проверить подпись на главном компьютере, сгенерирован другой MAC и сохранен в имени контейнера "XML_DSIG_RSA_KEY" на главном компьютере, следовательно, цифровая подпись не была проверена.

Q2:Верно ли это предположение??и каков наилучший способ справиться с этим...Должен ли я использовать сертификат для цифровой подписи XML-документа, а затем проверить его, в этом случае.должен ли я сопровождать сертификат 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-constructor, как вы это делали), вы сможете работать без полного доверия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top