Проверка XML DSIG - PullRequest
       23

Проверка XML DSIG

1 голос
/ 10 июля 2009

Я подписываю цифровой документ 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;
        }

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

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

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

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

1 Ответ

4 голосов
/ 10 июля 2009

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

...