2009-07-10 2 views
1

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

Я делаю следующее, чтобы проверить 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: [Мой первый вопрос - это лучший способ превзойти это] ?? Я знаю, что присвоение веб-приложения fulltrust и добавление пользователя к роли администратора не является яркой идеей, хотя оно работает

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

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

ответ

4

Чтобы ответить на ваш второй вопрос первым: вы хотите проверить 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(); 

чтобы ответить на ваш первый вопрос: когда вы больше не пытаются получить доступ к ПОИ хранилище ключей Vate (которое вы делали, вызывая конструктор RSACryptoServiceProvider, как и вы), вы сможете работать без полного доверия.