powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать Signature в XML файле?
25 сообщений из 39, страница 1 из 2
Как сделать Signature в XML файле?
    #38517250
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мне создать такой же по структуре файл, если у меня есть все данные для Object?
Или скажем, как переподписать файл, если мне надо что-то изменить внутри Object тэга?


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<LicenseFile xmlns="">
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
		<SignedInfo>
			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
			<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
			<Reference URI="#AuthorizedSettings">
				<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
				<DigestValue>a1oZF5JrZ7d+hx7nSPwSoRJ0G8o=</DigestValue>
			</Reference>
		</SignedInfo>
		<SignatureValue>i4J/XVVnwna4CtfA58LNhy+MIMDEYsEG8+DIvU6Vj2iPKvSgTeOXn5LgEjWJvWjwtdXf9qe09Fybjpr5LXhWsGf1PdAaPouZii40/Cx04Sya6nZ9jzafwg6rB3A6nElGbQdjS+N7+O5885YBnfNkCFeDKEu380wtqIwVcrJ66v0=</SignatureValue>
		<KeyInfo>
			<KeyValue>
				<RSAKeyValue>
					<Modulus>vbYT+A4bKu3wcRokOhIKE8/+eSrswuS3CCp3bsdNN1zZrQ2Wylc9m55FHKGygInr8IkR6MZ5WrI5Mi4IOsN5GVaj+c48A7ODE1EFgDu9HXfkXx8nULTkXeSXOl010zypPctH5fkTZ2epY6fJTAnctQWFY+TZrtM6hjIkFN/sbjE=</Modulus>
					<Exponent>AQAB</Exponent>
				</RSAKeyValue>
			</KeyValue>
		</KeyInfo>
		<Object Id="AuthorizedSettings">
			<ProductID xmlns="">P2</ProductID>
			<FirstName xmlns="">Vasya</FirstName>
			<LastName xmlns="">Petroff</LastName>
			<EmailAddress xmlns="">vasya@gmail.com<;/EmailAddress>
			<HardwareKey xmlns="">39645d14-9be4-480d-b292-546d2574c772</HardwareKey>
			<IssueDate xmlns="">1/2/2014 4:41:54 AM</IssueDate>
			<ProductMajorVersion xmlns="">8</ProductMajorVersion>
			<SchemaVersion xmlns="">1</SchemaVersion>
			<Custom xmlns="">
				<PAFragWatchedSqlServerConnections Value="5" Type="System.Int32" />
				<WatchedSsasConnections Value="2" Type="System.Int32" />
				<WatchedOracleConnections Value="5" Type="System.Int32" />
				<PAWatchedTaskSchedulerConnections Value="5" Type="System.Int32" />
				<WatchedSqlServerConnections Value="12" Type="System.Int32" />
				<WatchedTaskSchedulerConnections Value="5" Type="System.Int32" />
				<WatchedSharePointConnections Value="2" Type="System.Int32" />
				<PAWatchedSqlServerConnections Value="13" Type="System.Int32" />
				<PAWatchedSsasConnections Value="2" Type="System.Int32" />
			</Custom>
			<StandbyHardwareKeys xmlns="" />
		</Object>
	</Signature>
</LicenseFile>
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517341
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://www.google.ru/search?q=C# sign xml - первая же ссылка
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517375
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны https://www.google.ru/search?q=C# sign xml - первая же ссылка

да, спасибо, но приватного ключа нету....
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517442
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дождаться выхода квантовых компьютеров. Тогда можно будет подобрать ключ...
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517594
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikДождаться выхода квантовых компьютеров. Тогда можно будет подобрать ключ...
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517595
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходный файл

Код: xml
1.
2.
3.
4.
5.
6.
7.
<MyFile xmlns="">
<Object Id="Settings">
<ProductID xmlns="">P2</ProductID>
            <FirstName xmlns="">John</FirstName>
            <LastName xmlns="">Jackson</LastName>
</Object>
</MyFile>



Хотелось бы получить такой после подписки:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  <MyFile xmlns="">
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
       <Object Id="Settings">
       <ProductID xmlns="">P2</ProductID>
                <FirstName xmlns="">John</FirstName>
                <LastName xmlns="">Jackson</LastName>
       </Object>
    </Signature>
    </MyFile>




Но у меня получается такой, т.е. Signature отдельным блоком, а надо бы как выше привел:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<MyFile xmlns="">
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
    </Signature>
    <Object Id="Settings">
       <ProductID xmlns="">P2</ProductID>
                <FirstName xmlns="">John</FirstName>
                <LastName xmlns="">Jackson</LastName>
    </Object>
    </MyFile>



Вот код, что не так?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = false;
doc.Load(new XmlTextReader(FileName));
SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = Key;
Signature XMLSignature = signedXml.Signature;
Reference reference = new Reference("#Settings");
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
XMLSignature.SignedInfo.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue((RSA)Key));
XMLSignature.KeyInfo = keyInfo;

// Compute the signature.
signedXml.ComputeSignature();

XmlElement xmlDigitalSignature = signedXml.GetXml();

// Append the element to the XML document.
doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
if (doc.FirstChild is XmlDeclaration)
{
    doc.RemoveChild(doc.FirstChild);
}

// Save the signed XML document to a file specified
// using the passed string.
XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
doc.WriteTo(xmltw);
xmltw.Close();
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517613
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать это очень просто:
Код: c#
1.
2.
3.
4.
var signature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(signature);
var data = xmlDoc.DocumentElement.SelectSingleNode("/root/node");
signature.AppendChild(data);


но для начала рекомендую ознакомиться еще и вот с таким материалом: http://msdn.microsoft.com/ru-ru/library/ms229950(v=vs.110).aspx
Результат валидации после перемещния данных документа внутрь ноды с сигнатурой будет отрицательным всегда.
И идея смешать две абсолютно разнородные сущности - сигнатуру и подписываемые данные - выглядит очень странно.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517825
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныСделать это очень просто:
Код: c#
1.
2.
3.
4.
var signature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(signature);
var data = xmlDoc.DocumentElement.SelectSingleNode("/root/node");
signature.AppendChild(data);


но для начала рекомендую ознакомиться еще и вот с таким материалом: http://msdn.microsoft.com/ru-ru/library/ms229950(v=vs.110).aspx
Результат валидации после перемещния данных документа внутрь ноды с сигнатурой будет отрицательным всегда.
И идея смешать две абсолютно разнородные сущности - сигнатуру и подписываемые данные - выглядит очень странно.

спасибо! ознакомлюсь.

В том мто и дело, я бы оставил как есть, стандартно, т.е. когад сигнатура отдельным блоком.
Но в этом случае я получаю ошибку в приложении, что схема не валидна.
Из-за этого я пытаюсь сделать файл такой же, как и существующий, созданный не мной, а у него CheckSignature выдает true (!), и у него именно такая структура.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517908
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhВ том мто и дело, я бы оставил как есть, стандартно, т.е. когад сигнатура отдельным блоком.
Но в этом случае я получаю ошибку в приложении, что схема не валидна.
Просто в SignedXml.LoadXml передается не нода сигнатуры:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
static void Main()
{
  SignXml(@"
  <MyFile xmlns=''>
    <Object Id='Settings'>
      <ProductID>P2</ProductID>
      <FirstName>John</FirstName>
      <LastName>Jackson</LastName>
    </Object>
  </MyFile>", Certificate, @"D:\Trash\1.xml");
  var xd = new XmlDocument();
  xd.Load(@"D:\Trash\1.xml");
  var checker = new SignedXml(xd);
  // сигнатура - последний дочерний элемент корня
  var signature = (XmlElement)xd.SelectSingleNode("/*/*[last()]");
  checker.LoadXml(signature);
  var res = checker.CheckSignature(Certificate.PrivateKey);
  Console.WriteLine(res);
  Console.ReadKey(true);
}

static X509Certificate2 Certificate
{
  get
  {
    var keyStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    keyStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
    return keyStore.Certificates.Find(
      X509FindType.FindBySubjectDistinguishedName,
      "CN=MyCertificate", false
      ).Cast<X509Certificate2>().FirstOrDefault(
        c => !string.IsNullOrEmpty(c.Thumbprint) &&
        c.HasPrivateKey &&
        c.NotAfter > DateTime.Now &&
        c.NotBefore < DateTime.Now);
  }
}

static void SignXml(string content, X509Certificate2 certificate, string filePath)
{
  var xd = new XmlDocument();
  xd.LoadXml(content);
  var sx = new SignedXml(xd) { SigningKey = certificate.PrivateKey };
  var @ref = new Reference { Uri = string.Empty };
  @ref.AddTransform(new XmlDsigEnvelopedSignatureTransform());
  sx.AddReference(@ref);
  var keyInfo = new KeyInfo();
  var keyData = new KeyInfoX509Data(certificate);
  keyInfo.AddClause(keyData);
  sx.KeyInfo = keyInfo;
  sx.ComputeSignature();
  var signature = sx.GetXml();
  // сигнатура будет последним дочерним элементом корня
  xd.DocumentElement.AppendChild(signature);
  using (var fs = new FileStream(filePath, FileMode.Create))
  using (var xw = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true }))
    xd.Save(xw);
}


Полученный и подписанный xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <DigestValue>evQM25ma3WGkWkNic0d1g+XiVws=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>B9EcIp/chKi........................wJzuxtF4Gre0o=</SignatureValue>
    <KeyInfo>
      <X509Data>
        <X509Certificate>MIIB6TC..........................V/hE6sbFofg==</X509Certificate>
      </X509Data>
    </KeyInfo>
  </Signature>
</MyFile>


И если уж совсем нет уверенности, какой там элемент Signature по счету, его можно искать так:
Код: c#
1.
2.
3.
var xnm = new XmlNamespaceManager(xd.NameTable);
xnm.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");
var signature = (XmlElement)xmlDoc.SelectSingleNode("/*/ds:Signature", xnm);
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517914
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не проходит так

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    ...
  </Signature>
</MyFile>



Должно быть так:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    ...
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>  
</Signature>
</MyFile>




Может они исходят не их файла, а создают класс, выведенный из XmlDocument
Образно говоря так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
public class MyDocument: XmlDocument
{
string ProductID;
string FirstName;
string LastName;
 ...
}



и его подписывают как-то хитро и сохраняют в файл?
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517931
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhне проходит так
А у меня проходит. Показать скриншот с консольным выводом от вышеприведенного кода?
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517935
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныWinnipuhне проходит так
А у меня проходит. Показать скриншот с консольным выводом от вышеприведенного кода?

я прошу прощения, видимо не точно выражаюсь.

Когда я подсовываю такой структуры файл в приложение (не моё), то получаю ошибку на myDoc.Load(), что схема не валидна.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    ...
  </Signature>
</MyFile>



Потом я для эксперимента руками переставляю тег, чтобы он охватывал и объект тоже

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    ...
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>
  </Signature>
</MyFile>



загрузка проходит, т.е. схема теперь валидна и уже дальше выдается ошибка на myDoc.CheckSignature().
Это и понятно, я влез, куда не надо было.
Т.е, потому я и сделал вывод, что структура файла должна быть такой как в случае 2.
Остается вопрсо, как такую структуру получить, чтоыб при этом подпись была валидна.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517974
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhКогда я подсовываю такой структуры файл в приложение (не моё), то получаю ошибку на myDoc.Load(), что схема не валидна.
Да, теперь понятно - внешний xsd, в который прописали наличие сигнатуры. Хотя я тоже ступил, не заметив вот этого :
Код: xml
1.
<Reference URI="#AuthorizedSettings">


- это как раз ссылка на ноду подписываемого фрагмента (в случае пустого URI это весь документ, подробнее см. здесь: http://www.w3.org/TR/xmldsig-core/#sec-ReferenceProcessingModel)
Тогда при создании документа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(content);
var signedXml = new SignedXml(xmlDoc) { SigningKey = certificate.PrivateKey };
var @ref = new Reference { Uri = "#AuthorizedSettings" }; // следим, чтобы id подписываемой ноды соответствовало URI
@ref.AddTransform(new XmlDsigEnvelopedSignatureTransform());
signedXml.AddReference(@ref);
var keyInfo = new KeyInfo();
var keyData = new KeyInfoX509Data(certificate);
keyInfo.AddClause(keyData);
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
var signature = signedXml.GetXml();
// Ноду <Object Id='Settings'> помещаем внутрь сигнатуры
signature.AppendChild(xmlDoc.DocumentElement.ChildNodes[0]);
// Сигнатуру помещаем в документ
xmlDoc.DocumentElement.AppendChild(signature);
using (var fs = new FileStream(filePath, FileMode.Create))
using (var xw = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true }))
  xmlDoc.Save(xw);


и тогда верификация очень проста:
Код: c#
1.
2.
3.
4.
5.
6.
var xmlDoc = new XmlDocument();
xmlDoc.Load(@"....");
var signedXml = new SignedXml(xmlDoc);
var signature = (XmlElement)xmlDoc.DocumentElement.ChildNodes[0];
signedXml.LoadXml(signature);
var res = signedXml.CheckSignature(Certificate.PrivateKey);


- сигнатура сама возьмет Reference, хранимый в ней же, по Reference найдет нужные данные, и проверит их на соответствие. Здесь есть одно "но", связанное с использованием id-атрибутов (#Settings - именно указание на id-атрибут), но это немного другая тема.
Момент номер 2: при такм подписывании всё, что снаружи <Object Id='Settings'>, не подписывается.
Момент номер 3:
WinnipuhМожет они исходят не их файла, а создают класс, выведенный из XmlDocument
- нет, в файле указано:
Код: xml
1.
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">


- это стандарт подписи именно XML.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517979
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
моя ошибка, делал эксперименты,

Здесь есть одно "но", связанное с использованием id-атрибутов (#Settings - именно указание на id-атрибут), но это немного другая тема.
Момент номер 2: при такм подписывании всё, что снаружи <Object Id='Settings'>, не подписывается.


здесь везде не Settings, а AuthorizedSettings
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517980
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что примечательно, класс (не мой), а тот который грузит хмл файл в свои поля

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class LicDocument : XmlDocument
{
...

public LicDocument()
{
    base.PreserveWhitespace = true;
    this.xmlns = new XmlNamespaceManager(base.NameTable);
    this.xmlns.AddNamespace("xmlsignature", "http://www.w3.org/2000/09/xmldsig#");
// т.е. руками сами добавляют тег

...


}



в качестве Save используется базовый метод
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38517986
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhздесь везде не Settings, а AuthorizedSettings
Было и Settings: 15376176
Но это неважно - главное, чтобы при использовании XmlDsigEnvelopedSignatureTransform для URI локального документа указывался реально существующий в документе id элемента в формате xpointer scheme (#id - разумеется, только если не нужно подписывать весь документ).
Winnipuhт.е. руками сами добавляют тег
Добавляют namespace. В XmlNamespaceManager. Возможно, для последующего разбора (обработки элементов, относящихся к этому namespace). Метод Save к этому XmlNamespaceManager вообще никаким боком.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38518000
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сдела так как вы написали выше, но получил предполагаемый результат.

Вот как они делают в своем приложении:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
LicDocument document = new LicDocument(); // base XmlDocument
...
document.Load(this._Filename); // имя того файла
...

//проверка

  SignedXml xml = new SignedXml(document);
    XmlNodeList elementsByTagName = document.GetElementsByTagName("Signature");
    xml.LoadXml((XmlElement) elementsByTagName[0]);
    bool flag = xml.CheckSignature();
    foreach (XmlNode node in document.GetElementsByTagName("RSAKeyValue")[0].ChildNodes)
    {
        if (node is XmlElement)
        {
            XmlElement element = (XmlElement) node;
            if (element.Name == "Modulus")
            {
                if (element.InnerText != this._PublicKey.Modulus)
                {
                    Error("Invalid License Key");
                }
            }
            else if ((element.Name == "Exponent") && (element.InnerText != this._PublicKey.Exponent))
            {
                Error("Invalid License Key");
            }
        }
    }
    if (!flag)
    {
        Error("Invalid Signature.");
    }




И я попадаю на Error("Invalid Signature.");, т.е. проверяется весь файл, а не часть.
Собственно, как не крути, а получается, что надо и структуру сохранить, иначе дает ошибку схемы, и подписывать.
И вопрос остается...
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38518041
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhИ вопрос остается...
Итак, выше было сделано:
1) помещение подписываемого фрагмента внутрь ноды сигнатуры - как выше и требовалось;
2) валидация сигнатуры фрагмента из п.1. на тестовом примере с учетом того, что у сигнатуры Reference URI указывает именно на тот фрагмент, который нужно было подписать. Если ничего не получилось, то причин тому, опять же, может быть 2:
1) Действительно невалидная сигнатура - например, проверяем не тем, чем подписывали;
2) Не туда указывает Reference URI.
Ищите.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38518113
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

ищу, есть идеи.

Но вот незадача, нужна ваша помощь:
В вашем коде выше, в этом месте:

Код: c#
1.
2.
3.
  signature.AppendChild(xmlDoc.DocumentElement.ChildNodes[0]);
 // Сигнатуру помещаем в документ
 xmlDoc.DocumentElement.AppendChild(signature);



в исходном файле было так:

<Object Id="AuthorizedSettings">

После загрузки исходного файла так и осталось, после добавления этого куска к сигнатуре - так и осталось, это правильно.
А вот после
Код: xml
1.
xmlDoc.DocumentElement.AppendChild(signature);



стало:
Код: xml
1.
<Object Id="AuthorizedSettings" xmlns="" >



а это неправильно.

Как избавиться от этого атрибута имеено в этой строке?
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38518343
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhа это неправильно.
Нет, всё правильно, у ноды Object есть дефолтный неймспейс xmlns="", но в исходной разметке он не указан, потому что он наследуется с родительского узла, в котором это прописано явно:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<MyFile xmlns="">
  <Object Id="Settings">
    <ProductID>P2</ProductID>
    <FirstName>John</FirstName>
    <LastName>Jackson</LastName>
  </Object>
</MyFile>


Когда мы забираем узел Object, и помещаем его внутрь узла, у которого нет xmlns="" (узел Signature, имеется явно прописанный дефолтный неймспейс - прописанный выше не наследуется), парсер помнит про то, что у забираемого объекта есть неймспейс по умолчанию, и прописывает неймспейс явно. Всё остается точно так же, как и прежде.
И еще раз - код с тестовым примером:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
static void SignXmlWithEnvelope(string content, X509Certificate2 certificate, string filePath)
{
  var xmlDoc = new XmlDocument();
  xmlDoc.LoadXml(content);
  var signedXml = new SignedXml(xmlDoc) { SigningKey = certificate.PrivateKey };
  var @ref = new Reference { Uri = @"#Settings" };
  @ref.AddTransform(new XmlDsigEnvelopedSignatureTransform());
  signedXml.AddReference(@ref);
  var keyInfo = new KeyInfo();
  var keyData = new KeyInfoX509Data(certificate);
  keyInfo.AddClause(keyData);
  signedXml.KeyInfo = keyInfo;
  signedXml.ComputeSignature();
  var signature = signedXml.GetXml();
  signature.AppendChild(xmlDoc.DocumentElement.ChildNodes[0]);
  xmlDoc.DocumentElement.AppendChild(signature);
  using (var fs = new FileStream(filePath, FileMode.Create))
  using (var xw = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true }))
    xmlDoc.Save(xw);
}

static X509Certificate2 Certificate
{
  get
  {
    .....
  }
}


Подписываем в вышеприведенном документе узел <Object Id="Settings">:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
SignXmlWithEnvelope(@"
  <MyFile xmlns=''>
    <Object Id='Settings'>
      <ProductID>P2</ProductID>
      <FirstName>John</FirstName>
      <LastName>Jackson</LastName>
    </Object>
  </MyFile>",
  Certificate, @"D:\Trash\1.xml");


В файле D:\Trash\1.xml получаем следующее:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="utf-8"?>
<MyFile xmlns="">
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="#Settings">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <DigestValue>JcVPQRoHH4kpasAvbTA1NEw52bw=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>gLsig1m+n/bEJJDLsqJ..........CMOE=</SignatureValue>
    <KeyInfo>
      <X509Data>
        <X509Certificate>MIIB6TCCAVagAw........sbFofg==</X509Certificate>
      </X509Data>
    </KeyInfo>
    <Object Id="Settings" xmlns="">
      <ProductID>P2</ProductID>
      <FirstName>John</FirstName>
      <LastName>Jackson</LastName>
    </Object>
  </Signature>
</MyFile>


Подписанный узел Object Id="Settings" находится внутри узла Signature, у этого узла уже явно объявлен xmlns="".
Проверяем файл:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var xmlDoc = new XmlDocument();
xmlDoc.Load(@"D:\Trash\1.xml");
var signedXml = new SignedXml(xmlDoc);
var xnm = new XmlNamespaceManager(xmlDoc.NameTable);
xnm.AddNamespace("dsig", "http://www.w3.org/2000/09/xmldsig#");
var signature = (XmlElement) xmlDoc.SelectSingleNode("//dsig:Signature", xnm);
signedXml.LoadXml(signature);
var res = signedXml.CheckSignature(Certificate.PrivateKey);
Console.WriteLine(res);


- код выводит true.
Тестовый проект в аттаче (только для проверки там надо будет изменить код получения X509-сертификата - этот код заточен под мое личное хранилище и личные сертификаты).
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38518378
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

йез! спасибо!
Я так сделал, а потом оптимизировал: в исходный файл явно добавил xmlns того арента, к которому он будет перемещен, а он всегда стабилен:

Код: xml
1.
<Object Id="Settings" xmlns="http://www.w3.org/2000/09/xmldsig#">



Всё сработало! перехожу к следующей части, возможно попрошу еще помощи
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как сделать Signature в XML файле?
    #38865474
Roman0888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться я не пойму как подписать документ по вашему образцу, если мне нужно , что бы было вот так в конце
<Card>
...
...
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34311"/>
<ds:DigestValue>4h....fd</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>JifMm.......Q==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MI.......eh</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</Card>
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38869033
Roman0888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman0888Помогите разобраться я не пойму как подписать документ по вашему образцу, если мне нужно , что бы было вот так в конце
<Card>
...
...
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34311"/>
<ds:DigestValue>4h....fd</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>JifMm.......Q==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MI.......eh</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</Card>

Разобрался с префиксом ds:( спасибо Сон Веры Павловны нашел в другой теме), но все ровно не пойму как и откуда id=1 в этой строке
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1">
и еще такой момент что после подписания у меня так

<ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>

а должно быть вот так

<ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38870038
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman0888но все ровно не пойму как и откуда id=1 в этой строке
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1">
Установить нужное значение Signature.Id у SignedXml:
Код: c#
1.
2.
var sx = new SignedXml(xmlDoc) { SigningKey = certificate.PrivateKey };
sx.Signature.Id = "1";


Roman0888а должно быть вот так
<ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
в референс сигнатуры добавить еще одно преобразование:
Код: c#
1.
2.
3.
var @ref = new Reference { Uri = string.Empty };
@ref.AddTransform(new XmlDsigEnvelopedSignatureTransform());
@ref.AddTransform(new XmlDsigC14NWithCommentsTransform());


Roman0888Разобрался с префиксом ds:( спасибо Сон Веры Павловны нашел в другой теме)
Это вы про вот это? 15173377 Это в общем-то вредный совет - если валидация сигнатуры будет проводиться дотнетовскими средствами, то после такой операции она просто не пройдет. Видимо, это баг SignedXml - несмотря на фактическую идентичность подписей (дайджест, значение сигнатуры, и KeyInfo сертификата идентичны, разница только в префиксе неймспейса), валидация после такой операции не проходит. Если включить отладочные сообщения SignedXml (как - см. здесь ), то видно, что у подписей разный фактический хэш.
...
Рейтинг: 0 / 0
Как сделать Signature в XML файле?
    #38870148
Roman0888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо что ответили очень нуждаюсь в помощи, да про префикс ds: я взял от туда.
вообщем после получилось
<ds:Signature Id="1" xmlns:ds=" http://www.w3.org/2000/09/xmldsig#">
а нужно
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1">
Чтобы всех не путать объясню что и как есть сторонняя программа которая подписывает и отправляет xml вот так
<Request>
<Login>11</Login>
<Password>11</Password>
<Data><?xml version="1.0" encoding="utf-16"?><DC xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" version="2" xmlns=" http://........edit">
<Id xsi:nil="true"/><LastId>1</LastId>
<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"><ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><
ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#rsa-sha1"/>
<ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/></ds:Transforms>
<ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#sha1"/>
<ds:DigestValue>dR7...E=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>VaL...=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIIE....G</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</DC>
</Data>
</Request>

Я когда в свою программу вставляю что находится внутри <Data> , то все отправляется нормально!
Но когда я подписываю xml сам и заменяю "<" на "<" то сервер выдает ответ ошибка цифровой подписи.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать Signature в XML файле?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]