Проверка XML DSIG

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

Я делаю следующее, чтобы проверить 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;
        }

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

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

Мой второй вопрос касается возврата signedXml.CheckSignature(rsaKey); false. Теперь, насколько я понимаю, поскольку XML-документ имеет цифровую подпись на другом компьютере, MAC-адрес, используемый для его подписания, хранится на этих машинах. Имя контейнера KEY «XML_DSIG_RSA_KEY», но когда я попытался проверить подпись на хост-компьютере, другой MAC создан и сохранен в имени контейнера "XML_DSIG_RSA_KEY" на хост-компьютере, поэтому цифровая подпись не была проверена.

Вопрос 2. Верно ли это предположение?? и как лучше всего справиться с этим... Должен ли я использовать сертификат для цифровой подписи XML-документа, а затем проверить его в этом случае. должен ли я сопровождать сертификат XML-документом DSIG.???


person S M Kamran    schedule 10.07.2009    source источник


Ответы (1)


Чтобы сначала ответить на ваш второй вопрос: вы хотите проверить XML с помощью public части 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, как вы это делали), вы сможете работать без полного доверия.

person Rasmus Faber    schedule 10.07.2009